Nginx请求转发异常:访问/test路径返回404问题排查
问题分析与解决方案
核心问题
- Location匹配规则不匹配:你配置的
location /test/(带结尾斜杠)仅匹配以/test/开头的请求路径(如/test/xxx),但你访问的是/test(无结尾斜杠),此时Nginx会匹配到根location /,尝试在/usr/share/nginx/html目录下查找test文件/目录,找不到就返回404。 - Proxy_pass路径拼接逻辑问题:即使匹配到
/test/,当前proxy_pass http://10.32.19.107:8080/success的配置会将请求路径拼接为http://10.32.19.107:8080/successtest/(因为proxy_pass结尾无斜杠,Nginx会把匹配的/test/追加到目标URL后),这显然不是你想要的。
修复方案
根据你的需求(访问/test时返回/success页面),可以采用以下两种配置方式:
方式一:精确匹配单个路径
如果仅需要匹配/test这个精确路径,修改location配置为:
location = /test { proxy_pass http://10.32.19.107:8080/success; }
=表示精确匹配,只有当请求路径完全等于/test时才会触发该规则。- 此时Nginx会直接将请求代理到
http://10.32.19.107:8080/success,路径拼接逻辑不会出错。
方式二:匹配/test及/test/开头的所有路径
如果需要同时支持/test和/test/xxx这类路径(后者也代理到/success或/success/xxx),可以配置:
location ^~ /test { proxy_pass http://10.32.19.107:8080/success/; }
^~表示优先匹配该规则,避免被其他正则location覆盖。proxy_pass结尾添加斜杠后,Nginx会将/test之后的路径部分(如果有)追加到/success/后,比如/test/abc会代理到/success/abc。
验证步骤
- 修改
default.conf中的对应location配置。 - 重新加载Nginx配置(无需重启容器,执行
docker exec Nginx nginx -s reload即可)。 - 访问
http://10.32.19.107/test验证是否正常返回目标页面。
额外提示
- 避免重复挂载配置:你的Docker启动命令中同时挂载了
conf.d目录和default.conf文件,这可能导致配置覆盖冲突,建议只挂载conf.d目录即可,无需单独挂载default.conf。 - 查看Nginx日志:如果问题仍存在,可查看Nginx错误日志(
/var/log/nginx/error.log),里面会详细记录请求匹配的规则和代理路径,帮助定位问题。
内容的提问来源于stack exchange,提问作者Dick Donington
相关产品推荐
相关产品推荐

