Nginx反向代理下302重定向循环的根本原因是后端生成的Location头未适配代理后的访问上下文,需通过透传X-Forwarded头、动态构造URL、proxy_redirect重写或规范proxy_pass路径来解决。

当Nginx作为反向代理时,后端服务(如Spring Boot、Django、Node.js等)返回302重定向响应,若重定向地址是内部路径或含原始Host/Port,而Nginx未正确改写,就会导致浏览器反复跳转、形成重定向循环。根本原因是后端生成的Location头未适配代理后的访问上下文。
确保后端不硬编码跳转地址
后端应避免写死http://localhost:8080/login这类地址。推荐方式:
- 使用相对路径跳转(如
Location: /login),由浏览器自动补全当前协议、域名和路径前缀 - 通过请求头(如
X-Forwarded-Proto、X-Forwarded-Host)动态构造完整URL - 配置应用的“基础路径”或“服务器URL”,例如Spring Boot中设
server.forward-headers-strategy=framework并启用ForwardedHeaderFilter
在Nginx中透传关键转发头
让后端能识别真实客户端信息,从而生成正确的跳转地址:
-
proxy_set_header Host $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;—— 关键!后端据此判断是HTTP还是HTTPS proxy_set_header X-Forwarded-Host $host;proxy_set_header X-Forwarded-Port $server_port;
用proxy_redirect重写Location响应头
即使后端生成了绝对URL,Nginx也可在返回给客户端前改写Location头:
- 若后端返回
Location: http://localhost:8080/dashboard,而你希望变成https://example.com/dashboard,可加:
proxy_redirect http://localhost:8080/ https://$host/;
- 更通用的做法(适配多种后端地址): proxy_redirect ~^http://[^/]+(/.*)$ $scheme://$host$1;
- 禁用自动重写(仅当完全依赖后端逻辑时): proxy_redirect off;
检查Nginx location匹配与路径截断是否一致
例如Nginx配置为location /api/ { proxy_pass http://backend/; },注意末尾斜杠:
-
proxy_pass http://backend/;→ 会剥离/api/,后端收到/user而非/api/user - 若后端跳转返回
/api/login,而Nginx没配置对应规则,就可能404或错配 - 建议统一用带尾部斜杠的
proxy_pass,并在后端配置对应context-path

















