You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.30 07:12:47