Skip to content

HTTPS 重定向循环 ​

问题现象 ​

浏览器报重定向次数过多,同一个 URL 在 HTTP/HTTPS 或两种主机名之间反复跳转。

适用环境 ​

CDN/负载均衡、Caddy 或 Nginx、Spring Boot;多层 TLS 终止。

本文是可复用的排障示例,不代表某次个人生产事故。命令中的名称、账号和数据均为示例,执行前请替换为已确认的目标。

复现或诊断步骤 ​

  1. 用 curl -I 和 curl -IL --max-redirs 5 保存每一跳 Location。
  2. 标出在哪一层终止 TLS,检查转发的 Host、X-Forwarded-Proto 与可信代理配置。
  3. 分别从公网与内网请求同一路径,检查应用的 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,但不会解决服务端协议识别错误。

官方参考链接 ​

相关分类:部署与运维 · 全部笔记