curl -i -l可快速排查重定向链是否收敛;若返回err_too_many_redirects,需手动逐跳检查location是否在http/https间循环,并确认nginx仅在80端口块中配置跳转、正确透传并信任x-forwarded-proto头。

直接用 curl -I 模拟请求,观察响应头中的 Location 和状态码变化,是最快速、最可靠的排查方式。重点不是看页面能不能打开,而是看跳转链是否收敛。
用 curl 追踪跳转链路
在服务器本地或可信终端执行:
-
curl -I -L https://your-domain.com/login——-L自动跟随重定向,-I只看响应头,避免下载内容干扰 - 若返回
ERR_TOO_MANY_REDIRECTS,说明跳转未终止;此时去掉-L,逐次手动请求,记录每次的Status和Location - 特别注意 Location 值是否在
http://和https://之间来回切换,这是协议误判型死循环的典型特征
检查 Nginx 是否在 HTTPS 块内错误触发跳转
打开站点配置,确认以下两点:
- 所有
return 301或return 308必须只出现在listen 80的 server 块中,listen 443 ssl块里不能有任何跳转指令 - 避免使用
if ($scheme = "http") { return 308 ... }这类写法——它在多层代理下会失效,应改用if ($http_x_forwarded_proto != "https")判断原始协议
验证 X-Forwarded-Proto 是否正确透传
在 proxy_pass 所在 location 中,确认已设置:
-
proxy_set_header X-Forwarded-Proto $scheme;(直连 Nginx 场景) - 或
proxy_set_header X-Forwarded-Proto $http_x_forwarded_proto;(前面有 CDN 或网关时) - 同时补上
proxy_set_header Host $host;和proxy_set_header X-Real-IP $remote_addr;,防止后端因 Host 错误或 IP 为空而异常跳转
确认后端是否真正信任并使用该头
仅 Nginx 配置正确还不够,后端必须主动读取 X-Forwarded-Proto:
- WordPress:检查
wp-config.php是否有$_SERVER['HTTPS'] = 'on'的判断逻辑 - Django:确认
SECURE_PROXY_SSL_HEADER = ('HTTP_X_FORWARDED_PROTO', 'https')已启用且SECURE_SSL_REDIRECT = True - Spring Boot:查看是否配置了
server.forward-headers-strategy=framework或注册了ForwardedHeaderFilter











