Nginx反向代理Node.js安装SSL后报ERR_TOO_MANY_REDIRECTS错误
故障现象
通过Letsencrypt Certbot为站点安装SSL证书后,站点无法正常访问,证书安装前所有功能运行正常。使用Chrome浏览器访问时返回ERR_TOO_MANY_REDIRECTS错误,链路追踪可见请求在相同链接间反复重定向,检测截图如下:
服务器使用Nginx作为Web服务,故障时的配置见问题描述。
故障根因
重定向循环由两个配置问题共同导致:
- 443端口的反向代理规则缺失关键协议转发头:Nginx将HTTPS请求转发给运行在5000端口的后端服务时,没有告知后端当前请求是HTTPS协议。如果后端开启了强制HTTPS跳转,会误判当前请求为HTTP,返回HTTPS跳转响应,请求回到Nginx后再次转发给后端,后端再次跳转,形成死循环。
- 80端口的跳转规则存在冗余:Certbot自动生成的80端口配置中,先通过if规则匹配域名跳转HTTPS,末尾又添加了全局
return 404规则,虽然正常匹配逻辑下if规则优先级更高,但冗余配置在部分匹配场景下会触发异常跳转。
修复步骤
- 修改443端口server块内的反向代理配置,补充真实协议、客户端IP的转发头,将原有
location /段替换为以下内容:
location / { proxy_pass http://localhost:5000; proxy_http_version 1.1; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection 'upgrade'; 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_cache_bypass $http_upgrade; }
- 简化80端口的跳转配置,删除原有冗余的if判断和return 404规则,替换为以下内容:
server { listen 80 default_server; listen [::]:80 default_server; server_name ppealliance.com www.ppealliance.com; # 所有HTTP请求直接跳转HTTPS return 301 https://$host$request_uri; }
- 检查运行在5000端口的后端服务配置,如果服务提供了反向代理信任IP配置项,将
127.0.0.1加入信任列表,确保后端可以正确识别Nginx转发的协议头,不会自行触发重复跳转。 - 保存配置文件后,执行以下命令校验Nginx配置语法是否正确:
nginx -t - 确认语法校验无报错后,执行以下命令重载Nginx配置让修改生效:
systemctl reload nginx
验证方法
配置生效后,清空浏览器缓存或使用无痕模式访问站点,即可正常打开。如果仍存在跳转问题,可先临时关闭后端服务的强制HTTPS跳转功能,确认反代链路访问正常后再按需开启。
内容的提问来源于stack exchange,提问作者Iryi
相关产品推荐
相关产品推荐

