网站重定向循环排障
逐跳核对状态与 Location,区分协议、主机名、路径和代理协议感知问题。
适用范围与前提
HTTP/HTTPS 网站及反向代理;响应头文本本身不能证明完整跳转链。
- 仅请求获授权的目标和已确认无业务写入的路径;HEAD/GET 都会产生网络访问、日志和可能的应用副作用。
- 先记录浏览器 Network 的状态、Location、时间和实际入口;不要分享 Cookie、Authorization 或带令牌的跳转地址。
- 下面命令不自动跟随重定向;只有人工确认下一跳仍在授权范围内后才继续。
命令仅供手动复制到获授权的环境执行。站点不会连接服务器;涉及网络的诊断可能产生请求或登录审计记录。
1. 查看首跳,不自动携带凭据跟随
curl --head --max-time 5 https://example.com/预期现象:记录状态与 Location。3xx 不全是跳转,304 是协商缓存;HEAD 返回 405 不证明服务故障,可由负责人批准改用安全 GET 路径。
- 301/302/303/307/308 且有 Location → 对照 HTTP 与 HTTPS 入口
- 浏览器循环但 curl 无跳转 → 对照浏览器独有状态
- TLS/连接失败或 Location 不在授权范围 → 升级求助前收集
- 405 或证据不足 → 升级求助前收集
2. 对照 HTTP 与 HTTPS 入口
curl --head --max-time 5 http://example.com/
curl --head --max-time 5 https://example.com/预期现象:逐跳人工记录原 URL、状态和解析后的 Location,确认重复 URL。特别检查 http/https 往返、www/裸域互跳、路径尾斜杠;不要将代理 CONNECT 或 1xx 临时块当作重定向。
- 协议来回切换或代理与源站判断不一致 → 只读核对 TLS 终止和代理协议头
- 主机名或路径规范化规则相互冲突 → 修复建议(需人工确认)
- 无法在授权范围复现重复跳转 → 对照浏览器独有状态
3. 只读核对 TLS 终止和代理协议头
sudo nginx -t
sudo nginx -T预期现象:在获授权的 Nginx 主机查看命中配置,确认 TLS 在哪一层终止,以及可信代理如何设置/覆盖 Forwarded 或 X-Forwarded-Proto。完整配置可能含敏感信息;不能无条件信任客户端提供的协议头。
- 应用强制 HTTPS 与代理终止策略冲突 → 修复建议(需人工确认)
- 多层代理或应用配置不可见 → 升级求助前收集
4. 对照浏览器独有状态
# 在浏览器开发者工具 Network 中保留日志,人工核对实际跳转、Initiator、缓存和 Cookie;不要导出含凭据的 HAR。预期现象:区分服务端 3xx、HSTS 内部升级、JavaScript 跳转、旧 301 缓存和登录 Cookie。curl 不执行 JavaScript,也不自动复用浏览器 Cookie。
- 已定位缓存、客户端逻辑或登录回调冲突 → 修复建议(需人工确认)
- 缺少应用或身份提供方证据 → 升级求助前收集
修复建议(需人工确认)
- 经负责人确认后统一协议/域名/路径规范化规则,保留一个明确的跳转责任层和回退配置。
- 修正可信代理范围与协议传递,在 nginx -t 通过后按维护流程加载;不通过放宽所有代理信任来修复。
- 登录回调或 Cookie 策略由应用负责人检查;旧缓存仅在留存证据、确认影响后定向清除,不移除 HTTPS 或关闭证书验证。
验证恢复
- 从原浏览器和各授权入口验证有限跳转后到达预期页面,记录最终 URL 和状态。
- 确认登录/退出及正常凭据校验仍有效;检查各代理节点日志,不能只以 curl 首跳成功作为恢复标准。
升级求助前收集
- 脱敏逐跳表、时间、TLS 终止位置、可信代理拓扑、近期变更及浏览器/命令差异;不包含原 Cookie 或完整敏感 URL。