关键看proxy_pass后斜杠:带斜杠表示路径替换,不带则原样转发;location和proxy_pass均带斜杠是最常用安全组合,如location /api/ { proxy_pass http://backend/; }实现前端/api/login→后端/login。

关键就看 proxy_pass 后面那个斜杠——它不是格式问题,而是决定路径是“替换”还是“原样转发”的开关。配错一个字符,后端就收不到正确路径,404 就跟着来了。
location 和 proxy_pass 都带斜杠:最常用的安全组合
这是前后端分离场景下的推荐写法,适合后端服务监听根路径(比如 Spring Boot 默认跑在 /)。
- 配置示例:
location /api/ { proxy_pass http://backend/; } - 前端请求
/api/login→ 后端收到/login - 原理:Nginx 把匹配到的
/api/整段“抠掉”,再把proxy_pass后的/拼上去,剩余路径直接接续 - 注意:
location /api和location /api/在多数情况下效果一致,但为避免歧义,建议统一用带尾斜杠的写法
proxy_pass 带自定义路径:实现接口前缀重写
当后端 API 实际部署在子路径下(如 /v1),又不想让前端感知,可以用带路径的 proxy_pass 一步到位。
FastAPI + Flask 混合部署最佳实践,解决路由定义、API 代理等常见问题,适用于同时运行 FastAPI API 与 Flask 前端的场景。
- 配置示例:
location /service/ { proxy_pass http://backend/v1/; } - 前端请求
/service/users→ 后端收到/v1/users - 关键点:末尾斜杠不能省,否则会变成
/v1/service/users,多出一层前缀 - 若写成
http://backend/v1(不带尾斜杠),请求/service/users会转发为/v1users(路径粘连!)
正则或精确匹配时,proxy_pass 必须显式带路径
用 =、~ 或 ~* 时,Nginx 无法自动推断要截掉多少路径,必须手动写出目标 URI,否则启动失败。
- 错误写法:
location ~ ^/static/ { proxy_pass http://cdn; }(Nginx 启动报错) - 正确写法:
location ~ ^/static/(.+)$ { proxy_pass http://cdn/$1; } - 健康检查特例:
location = /health { proxy_pass http://backend/health; }—— 精确匹配 + 显式路径,安全可靠 - 捕获组(如
$1)要与正则中的括号严格对应,否则转发为空或错乱
用 rewrite 配合 proxy_pass 实现复杂路径改写
默认替换逻辑不够用时(比如需要调整路径层级顺序),rewrite 可以先重写 URI,再交给 proxy_pass 转发。
- 示例:把
/v2/api/users改成/api/v2/users - 配置:
location /v2/api/ { rewrite ^/v2/api/(.*)$ /api/v2/$1 break; proxy_pass http://backend/; } -
break表示重写后不再匹配其他 location,直接转发;不用last,避免循环重写 - 注意:rewrite 的正则捕获和
$1引用要准确对应,且需放在proxy_pass之前










