关键看proxy_pass后斜杠:带斜杠执行路径替换,不带则原样拼接;正则匹配时需显式写出目标路径;复杂改写用rewrite配合proxy_pass并置于其前。

关键就看 proxy_pass 后面那个斜杠——它不是格式问题,而是决定路径是“替换”还是“原样拼接”的开关。配错一个字符,后端就收不到正确路径,404 就跟着来了。
proxy_pass 带尾部斜杠:执行路径替换
这是最常用、最推荐的方式,适合后端监听根路径(如 /login、/users)的场景。
- location 匹配到的完整前缀(比如
/api/)会被完全移除 - 剩余路径直接拼到
proxy_pass指定的路径之后(哪怕只是/) - 示例:
location /api/ { proxy_pass http://backend/; }
→ 请求/api/v2/profile,后端收到/v2/profile - 若后端实际部署在子路径(如
/v1),可写成:location /service/ { proxy_pass http://backend/v1/; }
→ 请求/service/users,后端收到/v1/users(注意末尾斜杠不能省,否则变成/v1users)
proxy_pass 不带尾部斜杠:执行原样拼接
这种写法容易出错,需特别谨慎。
FastAPI + Flask 混合部署最佳实践,解决路由定义、API 代理等常见问题,适用于同时运行 FastAPI API 与 Flask 前端的场景。
- 只写协议+主机+端口(如
http://backend):原始请求 URI 全量透传
→location /admin { proxy_pass http://backend; }+ 请求/admin/info→ 后端收到/admin/info - 写了路径但末尾无斜杠(如
http://backend/v1):前缀被整体替换,且不加分隔符
→location /api/ { proxy_pass http://backend/v1; }+ 请求/api/users→ 后端收到/v1users(不是/v1/users!)
正则或精确匹配时必须显式写出目标路径
用 =、~ 或 ~* 时,Nginx 无法自动推断要截掉多少路径,proxy_pass 必须带完整 URI,否则配置加载失败。
- 错误写法:
location ~ ^/static/ { proxy_pass http://cdn; }(启动报错) - 正确写法:
location ~ ^/static/(.+)$ { proxy_pass http://cdn/$1; } - 健康检查常用精确匹配:
location = /health { proxy_pass http://backend/health; } - 捕获组(如
$1)必须与正则括号严格对应,否则转发为空或错乱
复杂路径改写用 rewrite 配合 proxy_pass
当默认替换逻辑不够用(比如要调整路径层级顺序),可在 proxy_pass 前加 rewrite 提前重写 URI。
- 示例:把
/v2/api/users改成/api/v2/userslocation /v2/api/ {<br> rewrite ^/v2/api/(.*)$ /api/v2/$1 break;<br> proxy_pass http://backend/;<br>} -
break表示重写后不再匹配其他 location,直接转发;避免用last,防止循环重写 -
rewrite的正则捕获和$1引用必须准确对应,且必须放在proxy_pass之前

















