同一系统内部调用Nginx返回301永久重定向错误问题求助
问题根因
- 配置规则与预期不符:你预期
/api前缀的请求都转发到8090后端,但实际配置仅匹配/api/v1/开头的请求,访问/api路径时未命中对应代理规则,请求会被转发到前端8080服务,301跳转大概率由前端服务返回。 - 路径匹配规则缺失:即便调整前缀匹配规则后,如果访问路径不带末尾斜杠(如
/api而非/api/),Nginx默认的路径标准化逻辑也可能返回301跳转补充斜杠。 - 容器解析异常:运行在9000端口的Docker容器如果无法正确将
example.com解析到宿主机Nginx监听IP,也可能触发异常跳转。
修复步骤
- 调整API路径匹配规则,替换原有的
location /api/v1/配置块,匹配所有/api前缀的请求,注意需要将/api/v1/socketio/的配置块放在本规则之前,保证长路径优先匹配:
location ^~ /api/ { proxy_pass http://localhost:8090/; # 补充请求头避免后端服务识别异常 proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; }
注意proxy_pass末尾的斜杠会自动将请求路径中的/api/前缀移除后转发到后端,如果你需要后端收到完整的/api/xxx路径,删掉末尾的斜杠即可。
- 兼容无末尾斜杠的
/api请求,新增精确匹配规则:
location = /api { # 方案1:跳转至带斜杠的路径(推荐) return 301 /api/; # 方案2:直接转发到后端 # proxy_pass http://localhost:8090/; }
- 验证Docker容器域名解析:进入9000端口的容器执行
curl -v https://example.com/api,查看301响应的Location头确认跳转来源。如果解析异常,容器运行时可添加--add-host=example.com:宿主机局域网IP参数修复。 - 配置修改完成后执行
nginx -t验证合法性,再执行nginx -s reload重载配置生效。
内容的提问来源于stack exchange,提问作者Vikash
相关产品推荐
相关产品推荐

