Nginx多路径转发需用location按前缀匹配并正确配置proxy_pass尾部斜杠以避免路径重复;支持正则提取重写,还需设置代理头和超时、容错机制。

用 Nginx 实现多路径转发,核心是通过 location 指令按 URL 路径前缀区分请求,并分别指向不同后端服务。配置关键在于路径匹配逻辑和 proxy_pass 的尾部斜杠处理,稍有不慎就会导致路径拼接错误或 404。
按路径前缀分发请求
这是最常用也最直观的方式。比如把 /api1/、/api2/、/static/ 分别转给三台后端服务:
-
location /api1/ { proxy_pass http://127.0.0.1:8081/; }—— 斜杠结尾,自动截掉/api1/再拼接 -
location /api2/ { proxy_pass http://127.0.0.1:8082/; }—— 同理,路径重写由 Nginx 自动完成 -
location /static/ { proxy_pass http://127.0.0.1:8083/; }—— 静态资源单独剥离,便于缓存或 CDN 对接
注意:所有 proxy_pass 地址末尾都带 /,这样 Nginx 才会把原始请求中匹配的路径段(如 /api1/users 中的 /api1/)去掉,只转发 /users 到后端。
避免路径重复拼接的坑
如果 proxy_pass 后不加 /,Nginx 会原样保留原始路径,造成双份前缀。例如:
- 错误写法:
location /api1/ { proxy_pass http://127.0.0.1:8081; } - 请求
/api1/users→ 实际转发为http://127.0.0.1:8081/api1/users(后端收不到) - 正确写法:
location /api1/ { proxy_pass http://127.0.0.1:8081/; }→ 转发为/users
支持正则匹配的灵活路由
当路径规则较复杂(如版本号、租户标识嵌入路径),可用正则表达式提取并重写:
location ~ ^/v(\d+)/user/(.*)$ { proxy_pass http://127.0.0.1:8084/$2$is_args$args; }- 请求
/v2/user/profile→ 提取$2=profile,转发为/profile -
$is_args$args确保查询参数(如?id=123)完整传递
补充必要代理头和容错设置
仅转发还不够,后端常需真实客户端信息,且要防意外中断:
-
proxy_set_header Host $host;—— 透传原始 Host,方便后端做虚拟主机识别 -
proxy_set_header X-Real-IP $remote_addr;和X-Forwarded-For—— 传递真实 IP -
proxy_read_timeout 300;—— 防止长连接超时中断 -
proxy_next_upstream error timeout http_502;—— 出错时尝试其他上游(如有集群)
不复杂但容易忽略

















