深浅主题
HTTPS 重定向循环
问题现象
浏览器报重定向次数过多,同一个 URL 在 HTTP/HTTPS 或两种主机名之间反复跳转。
适用环境
CDN/负载均衡、Caddy 或 Nginx、Spring Boot;多层 TLS 终止。
本文是可复用的排障示例,不代表某次个人生产事故。命令中的名称、账号和数据均为示例,执行前请替换为已确认的目标。
复现或诊断步骤
- 用 curl -I 和 curl -IL --max-redirs 5 保存每一跳 Location。
- 标出在哪一层终止 TLS,检查转发的 Host、X-Forwarded-Proto 与可信代理配置。
- 分别从公网与内网请求同一路径,检查应用的 canonical URL、登录回调与 CDN 模式。
原因分析
外层已完成 HTTPS,内层应用却因不信任代理头认为请求是 HTTP,于是再次重定向到外部同一地址。另一种原因是两层各自要求不同主机名或末尾斜杠。
修复示例
bash
curl -I https://app.example.com/login
curl -IL --max-redirs 5 https://app.example.com/login
# 只保留脱敏 Location,不输出 Cookie 或授权头
# Spring Boot(仅在代理可信且直连受限时评估):
# server.forward-headers-strategy=framework明确一层负责外部 HTTPS 和规范主机名;正确传递协议头,并只信任受控代理。修改前保存 CDN 与应用配置,先在测试域验证;回退恢复原模式。不要通过关闭 HTTPS 或信任任意客户端转发头消除循环。
验证方法
HTTP 最多按预期跳到 HTTPS,HTTPS 页面与登录回调不重复跳转。测试带查询参数和编码路径,确认原参数未丢失;检查安全 Cookie 与生成的绝对 URL。
常见误区
curl -k 只能跳过证书校验,不能修复循环。仅清浏览器缓存可能暂时隐藏旧 301,但不会解决服务端协议识别错误。