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)🎯
三、细节与坑位(避坑清单)
-
查询串保留: