Nginx代理后SpringBoot后端返回404:rmer路径重复原因排查
从你描述的路径重复(比如实际转发路径变成/rmer/rmer/getAllMvsVDetailC)导致404的情况来看,核心问题大概率出在Nginx的proxy_pass配置是否带尾斜杠的差异上,这是代理配置里最容易踩的坑之一。
关键差异点:proxy_pass末尾的斜杠
Nginx对proxy_pass的处理逻辑会根据末尾是否带斜杠完全不同:
对于正常的
/apcc请求:
如果你的配置是这样的:location /apcc/ { proxy_pass http://apcc-backend/; # 其他配置如proxy_set_header等 }当请求
/apcc/spd/sensitivePart/findAll/时,Nginx会把location匹配到的/apcc/替换成proxy_pass末尾的斜杠,最终转发到后端的路径是/spd/sensitivePart/findAll/,刚好匹配后端接口。对于异常的
/rmer请求:
如果你的配置是这样的(不带尾斜杠):location /rmer { proxy_pass http://rmer-backend; # 其他配置 }当请求
/rmer/getAllMvsVDetailC时,Nginx会把整个匹配到的/rmer加上后续路径,直接转发成/rmer/getAllMvsVDetailC到后端。如果你的后端接口本身是/getAllMvsVDetailC(没有/rmer前缀),就会出现路径重复,导致404。
修复方案
根据后端接口的实际路径调整proxy_pass:
如果后端
rmer服务的接口没有/rmer前缀,修改配置为:location /rmer/ { proxy_pass http://rmer-backend/; # 保持和/apcc一致的其他代理配置 }(注意
location和proxy_pass都要带尾斜杠,确保Nginx正确替换路径)如果后端
rmer服务的接口本身就有/rmer前缀,那可能是前端请求路径多写了一层/rmer,需要检查前端的请求URL配置。
排查验证
可以查看Nginx的access日志(通常在/var/log/nginx/access.log),里面会记录实际转发到后端的完整路径,通过日志能直接确认是否出现了路径重复的问题,帮助定位到底是Nginx配置还是前端请求的问题。
内容的提问来源于stack exchange,提问作者Kalio O'Farril

