求助:Nginx+Let's Encrypt+反向代理配置引发无限重定向循环的原因排查
咱们先来拆解你遇到的问题:证书过期后,哪怕注释掉了HTTP转HTTPS的return 301配置,访问站点还是会反复跳转到HTTPS,而Resilio Sync的同步功能正常,说明后端服务本身没毛病,问题大概率出在Nginx配置、浏览器缓存或者后端的重定向逻辑上。
下面是几个最可能的原因和对应的解决步骤:
1. 浏览器缓存了永久重定向(301)
你一开始配置的return 301 https://$server_name$request_uri是永久重定向,浏览器会把这个规则缓存很久——哪怕你后来把这行注释掉了,浏览器依然会自动跳转到HTTPS,这很容易让你误以为问题还在服务器配置上。
解决办法:
- 打开浏览器开发者工具(按F12),切换到「网络」标签,勾选「禁用缓存」,然后刷新站点试试。
- 或者直接清掉浏览器的缓存和Cookie,再重新访问。
2. Resilio Sync自身在强制HTTPS重定向
Resilio Sync的Web GUI可能被设置成了强制用HTTPS,当Nginx把HTTPS请求转发到它的HTTP端口(127.0.0.1:8888)时,Resilio Sync会返回一个跳转到HTTPS的响应,而Nginx已经在HTTPS端口处理请求,这不就形成循环了嘛。
验证方法:
在服务器上用curl直接访问Resilio的本地端口,看看响应头里有没有重定向:
curl -I http://127.0.0.1:8888
如果响应里有Location: https://site.example.com/这类内容,那就是Resilio在发重定向。
解决办法:
- 找到Resilio Sync的配置文件(一般在
~/.config/resilio-sync/或者/etc/resilio-sync/目录下的config.json),找到webui部分,把force_https改成false:"webui": { "listen": "127.0.0.1:8888", "force_https": false } - 重启Resilio Sync服务:
sudo systemctl restart resilio-sync
3. 过期SSL证书触发的异常循环
你的SSL证书已经过期了,Nginx处理HTTPS请求时会出问题,有些浏览器会自动尝试降级到HTTP,但又被之前缓存的301重定向拉回HTTPS,一来一回就形成了无限循环。
解决办法:
- 用Certbot更新证书就行:
sudo certbot renew --nginx - 证书更新成功后,记得重启Nginx:
sudo systemctl restart nginx
4. Nginx SSL协议配置的兼容性问题
你的Nginx里ssl_protocols只开了TLSv1.1和TLSv1.2,现在很多现代浏览器都优先用TLSv1.3,缺了这个协议可能导致SSL握手失败,触发浏览器的自动重定向逻辑。
解决办法:
更新ssl_protocols配置,加上TLSv1.3(顺便把已经废弃的TLSv1.1去掉更安全):
ssl_protocols TLSv1.2 TLSv1.3;
排查顺序建议
- 先禁用浏览器缓存验证,排除缓存的锅;
- 检查Resilio的本地响应,确认是不是后端在发重定向;
- 优先更新过期证书——毕竟问题是在证书过期后才出现的,这是最可能的根源;
- 最后调整SSL协议配置,确保兼容性。
内容的提问来源于stack exchange,提问作者Mikko Saari

