proxy_pass末尾斜杠决定路径处理逻辑:带斜杠执行路径替换(如/api/→/),不带则全量透传或错误拼接;正则匹配时必须显式写URI;复杂映射可用rewrite配合break。

配置 location 块中的 proxy_pass 时,末尾斜杠不是风格问题,而是路径处理逻辑的开关。它直接决定 Nginx 是“保留并拼接”原始路径,还是“剥离前缀后替换”。搞错就会让后端收不到正确 URI,导致 404 或接口错乱。
带斜杠:执行路径替换(推荐多数场景)
当 proxy_pass 以 / 结尾(如 http://backend/ 或 http://backend/v1/),Nginx 会把 location 匹配到的整个前缀(比如 /api/)完全去掉,再把剩余路径拼到 proxy_pass 的路径之后。
-
典型写法:
location /api/ { proxy_pass http://127.0.0.1:3000/; } - 请求
/api/users→ 后端收到/users - 请求
/api/v2/profile→ 后端收到/v2/profile - 适用场景:后端服务监听根路径(如 Express 默认、Spring Boot 无上下文路径)
不带斜杠:执行路径拼接(慎用)
当 proxy_pass 不含路径或虽有路径但末尾无 /(如 http://backend 或 http://backend/v1),Nginx 行为分两种:
-
仅协议+主机+端口(如
http://backend)→ 原始请求 URI 全量透传
请求/api/users→ 后端收到/api/users -
带非斜杠结尾路径(如
http://backend/v1)→ 前缀被整体替换,且无自动分隔符
请求/api/users→ 后端收到/v1users(不是/v1/users!极易出错)
正则或精确匹配时必须显式写 URI
使用 =、~、~* 等匹配方式时,Nginx 无法自动推导要截掉多少路径,proxy_pass 必须带完整目标路径,否则启动失败。
- 错误:
location ~ ^/static/ { proxy_pass http://cdn; }(Nginx 拒绝加载) - 正确:
location ~ ^/static/(.+)$ { proxy_pass http://cdn/$1; } - 健康检查示例:
location = /health { proxy_pass http://backend/health; }
用 rewrite 补足复杂映射需求
当默认替换/拼接逻辑不够用(比如需重排路径层级),可配合 rewrite 提前改写 URI,再交由 proxy_pass 转发。
- 例如将
/v2/api/users改为/api/v2/users:location /v2/api/ {<br> rewrite ^/v2/api/(.*)$ /api/v2/$1 break;<br> proxy_pass http://backend/;<br>} - 务必加
break,防止 rewrite 后再次进入 location 匹配循环


















