Nginx路径映射由location匹配类型与proxy_pass结尾斜杠共同决定:proxy_pass带/时剥离匹配前缀后拼接,不带/时原样拼接完整URI;正则或精确匹配需显式指定URI;复杂重写需配合rewrite指令。

Nginx 反向代理的路径映射不是简单拼接,而是由 location 匹配逻辑和 proxy_pass 的写法共同决定的。核心在于:Nginx 会先根据请求 URI 匹配到某个 location 块,再依据该块中 proxy_pass 指令末尾是否带斜杠、以及 location 自身的匹配类型(前缀、精确、正则),来决定最终发给后端的路径是什么。
带尾部斜杠的 proxy_pass:自动剥离 location 前缀
当 proxy_pass 的目标地址以 / 结尾时,Nginx 会把 location 中匹配到的那部分路径“砍掉”,只把剩余 URI 发给后端。
-
location /api/ { proxy_pass http://backend/; }
→ 请求/api/users→ 后端收到/users -
location /v2/ { proxy_pass http://svc:3000/; }
→ 请求/v2/order/123→ 后端收到/order/123
这是最推荐的写法,适合前后端分离架构,要求后端服务监听在根路径上。
不带尾部斜杠的 proxy_pass:原样拼接完整 URI
如果 proxy_pass 地址不以 / 结尾(例如 http://backend 或 http://backend:8080),Nginx 会把原始请求 URI 直接追加到该地址后面。
-
location /api { proxy_pass http://backend; }
→ 请求/api/users→ 后端收到http://backend/api/users -
location /static { proxy_pass http://cdn.example.com; }
→ 请求/static/logo.png→ 后端收到http://cdn.example.com/static/logo.png
这种写法容易导致后端因路径含前缀而返回 404,除非后端明确按此结构部署,否则应避免。
正则或精确匹配 location 必须显式指定 URI
当使用 =(精确)、~(区分大小写正则)或 ~*(不区分大小写正则)定义 location 时,proxy_pass 后面必须带 URI,不能只写域名或 IP。
- ✅ 正确:
location ~ ^/admin/(.*)$ { proxy_pass http://admin-svc/$1; } - ✅ 正确:
location = /health { proxy_pass http://backend/health; } - ❌ 错误:
location ~ ^/api/ { proxy_pass http://backend; }(会报错或行为异常)
因为正则匹配不提供可剥离的“固定前缀”,Nginx 无法自动推导如何截取路径,必须靠你用 $1、$2 等捕获组或显式 URI 控制转发内容。
复杂路径重写需配合 rewrite 指令
当需要更精细控制(如去掉多级前缀、添加固定路径、替换路径段),单靠 proxy_pass 不够,得用 rewrite 配合。
- 把
/legacy/v1/user/123改成/user/123转发:location /legacy/v1/ { rewrite ^/legacy/v1/(.*)$ /$1 break; proxy_pass http://new-api/; } - 所有请求统一加
/v2前缀:location / { proxy_pass http://svc/; rewrite ^(.*)$ /v2$1 break; }
break 表示重写后不再匹配其他 location,直接走 proxy_pass;若用 last,则重写后重新匹配 location,需注意循环风险。


















