Nginx无法转发location的URL子元素至Docker容器内的代理服务
问题原因与解决方法
问题根源
你遇到的问题核心是Nginx在proxy_pass使用变量时,URI转发逻辑和固定地址场景完全不同。
如果直接写固定地址的proxy_pass http://ce-api:3100/;,Nginx会自动把location /api/匹配到的前缀/api/去掉,将后面的auth/ping拼到目标地址,最终转发到http://ce-api:3100/auth/ping。
但你用了变量$api后,Nginx不会自动截断/api/前缀,而是把完整的请求路径/api/auth/ping直接传给后端,导致Node.js服务器收到的请求是/api/auth/ping,而你的后端路由只有/auth/ping,自然返回404。
修复方案
有两种实用的修复方式:
方式一:用rewrite手动截断前缀
修改location /api/块,添加rewrite指令剥离/api/前缀:
location /api/ { resolver 127.0.0.11 valid=30s; set $api ce-api; rewrite ^/api/(.*)$ /$1 break; proxy_pass http://$api:3100; }
rewrite ^/api/(.*)$ /$1 break会把/api/auth/ping转换成/auth/ping后再传给后端,注意此时proxy_pass末尾不要加斜杠。
方式二:调整location与proxy_pass写法
如果不想用rewrite,可以修改location规则并直接传递完整请求URI:
location /api { resolver 127.0.0.11 valid=30s; set $api ce-api; proxy_pass http://$api:3100$request_uri; }
不过这种方式需要确保后端路由能兼容,更推荐第一种方式,逻辑更清晰可控。
验证
修改配置后执行nginx -s reload重载配置,再访问ce.mysite.com/api/auth/ping,后端应该能收到/auth/ping的请求并返回正常响应。
内容的提问来源于stack exchange,提问作者webnoob
相关产品推荐
相关产品推荐

