nginx 反向代理注意
1. Nginx中正则捕获组在proxy_pass中不可用
有一个需求, 根据不同的路径代理到后端
问题出在 $1 这个正则捕获组上。在 Nginx 中,正则表达式中的捕获组是根据 () 定义的,但这个捕获组只在 location 内部有效,并且不会传递到 proxy_pass 中。
所以当你在 proxy_pass 中使用 $1 时,它实际上是一个空值,因为它不是从 location 中传递过来的。这导致了404错误,因为代理请求时的URL可能不是你期望的。
为了解决这个问题,你可以使用 rewrite 指令来重写 URI,然后再将请求代理到后端服务器。你的配置可以改为以下形式:
# 作业服务 - 正式预发 (正确写法)
location ~* /next/api/(work|exam) {
rewrite ^/next/api/(work|exam)(.*)$ /$1$2 break;
## 或者这样也行 rewrite ^/next/api/(.*)$ /$1 break;
proxy_pass http://work.release.test.org:81 ;
proxy_http_version 1.1;
proxy_set_header Connection "";
proxy_set_header X-Forwarded-Proto $scheme;
}
### 错误写法
# 作业服务 - 正式预发
location ~* /next/api/(work|exam) {
# 这会导致 nginx 直接返回 404 错误 ---
proxy_pass http://work.release.test.org:81/$1 ;
proxy_http_version 1.1;
proxy_set_header Connection "";
proxy_set_header X-Forwarded-Proto $scheme;
}