Nginx中location和proxy_pass的斜杠问题
发布时间:2025-09-05 00:01       
Nginx 中 location
与 proxy_pass
的斜杠规则(一次讲清)
在反向代理里,“斜杠”决定 URI 是否被替换。先记住三条铁则 🔧:
proxy_pass
是否“带 URI”
- 形如
http://upstream/
、http://upstream/api/
→ 带 URI(哪怕只是一个/
)。 - 形如
http://upstream
→ 不带 URI。
影响:带 URI → 替换匹配到的前缀;不带 URI → 原样透传。
- 前缀
location
(location /api/ { ... }
)的替换规则
- 带 URI 的
proxy_pass
:用proxy_pass
的 URI 替换请求中与location
匹配的 前缀。 - 不带 URI 的
proxy_pass
:不替换,原始 URI 完整转发。
- 正则
location
(~
/~*
)不自动替换
- 正则匹配时不会套用“前缀替换”规则,通常用 捕获组
$1
手动拼接到proxy_pass
的 URI。
一、四象限速查(以请求 /api/foo
为例)
location 写法 |
proxy_pass 写法 |
上游实际请求路径 | 说明 |
---|---|---|---|
location /api/ {} |
proxy_pass http://up/; |
/foo |
带 URI,用 / 替换掉匹配前缀 /api/ 。 |
location /api/ {} |
proxy_pass http://up; |
/api/foo |
不带 URI,原样透传。 |
location /api {} |
proxy_pass http://up/; |
/foo |
仍是前缀匹配;把 /api 替换为 / 。 |
location / {} |
proxy_pass http://up/api/; |
/api/foo |
把根前缀 / 替换为 /api/ ,实现路径前缀“加一段”。 |
反例 ⚠️:
location / { proxy_pass http://up/api; } # 注意末尾没“/”
访问
/v1
会变成上游/apiv1
(少了斜杠)。修正:proxy_pass http://up/api/;
✅
二、常见场景写法与结果
1) 后端保持原始路径(最稳)
location /api/ {
proxy_pass http://upstream; # 不带 URI
}
- 结果:
/api/foo
→ 上游/api/foo
(透传,便于后端按原路由处理)🙂
2) 去掉前缀 /api/
再转发(网关常用)
location /api/ {
proxy_pass http://upstream/; # 带 URI,仅为 “/”
}
- 结果:
/api/foo
→ 上游/foo
(等于由 Nginx 剥掉/api/
)🚀
3) 给所有请求统一加前缀 /app/
location / {
proxy_pass http://upstream/app/; # 带 URI 为 “/app/”
}
- 结果:
/foo
→ 上游/app/foo
(适合后端挂载子路径)👍
4) 正则匹配:手动拼接
location ~ ^/img/(.+)$ {
proxy_pass http://img-server/$1; # 显式使用捕获组
}
- 结果:
/img/a/b.png
→ 上游/a/b.png
(正则不自动替换,靠$1
)🎯
三、细节与坑位(避坑清单)
-
查询串保留: