【问题描述】使用 IP 访问是否带 / 均正常,Nginx 配置负载均衡后:
请求 /api-gateway/api/report/analysis/ 正常工作 请求 /api-gateway/api/report/analysis 返回 404【Nginx 配置】
location ^~ /api-gateway/ { proxy_pass http://backend-service/; # ... 其他配置 }【后端接口】
接口路径: /api/report/analysis/ 请求方法: POST 功能描述: 对查询结果进行智能解读分析
【原理】当 location 指令和 proxy_pass 指令都包含路径时,Nginx 会执行路径替换操作:
location 匹配到的前缀部分会被 proxy_pass 中指定的路径替换
剩余的 URI 部分会直接拼接到 proxy_pass 的地址后面
location ^~ /api-gateway/ → proxy_pass http://backend-service/
^^^^^^^^^^^^^^^^ ^^^^^^^^^^^^^^^^^
这部分会被替换 替换成这个【请求带末尾斜杠】
原始请求: /api-gateway/api/report/analysis/ |______________||____________________| 匹配部分(被替换) 剩余部分(保留) 转发结果: http://backend-service/ + api/report/analysis/ = http://backend-service/api/report/analysis/【请求不带末尾斜杠】
原始请求: /api-gateway/api/report/analysis |______________||___________________| 匹配部分(被替换) 剩余部分(保留) 转发结果: http://backend-service/ + api/report/analysis = http://backend-service/api/report/analysis
**【问题】为什么不走 Nginx 时带不带斜杠都可以?**大多数现代 Web 框架都内置了对末尾斜杠的容错处理,比如重定向机制。通过 Nginx 代理访问,这种自动重定向机制可能不生效,或者 Nginx 拦截了重定向响应。
【NG】 路由匹配失败,后端无这样的接口:http://backend-service/api/report/analysis 【IP】 依赖Flask等框架重定向:http://ip:port/api/report/analysis