问题本质是浏览器HSTS策略主动拦截HTTP请求,导致Nginx日志无跳转记录;需分四步排查:确认HSTS是否生效、检查服务端是否发送HSTS头、临时设max-age=0并清理客户端缓存、警惕预加载风险。

这个问题本质不是 Nginx 在跳转,而是浏览器记住了 HSTS 策略后主动拦截 HTTP 请求——它根本没把请求发出去,自然查不到 Nginx 日志里的 301/302。排查要分三步走:先确认 HSTS 是否生效,再看服务端是否还在发 HSTS 头,最后清理客户端缓存。
一、确认浏览器是否已启用 HSTS
直接在 Chrome 或 Edge 地址栏输入:
chrome://net-internals/#hsts
在下方 “Query domain” 框中输入你的测试域名(如 test.example.com),点击 “Query”。
如果返回 Found,说明该域名已被记录,max-age 值就是浏览器强制 HTTPS 的时长;若显示 Not found,问题大概率出在别处。
二、检查 Nginx 是否仍在发送 HSTS 响应头
用 curl 模拟首次访问,重点看响应头里有没有 Strict-Transport-Security:
- 执行 curl -I https://test.example.com,观察输出中是否含
Strict-Transport-Security: max-age=... - 如果是裸 Nginx 配置,检查
server块中是否有类似add_header Strict-Transport-Security "max-age=31536000; includeSubDomains";的行 - 如果是 Kubernetes Ingress,查看对应资源的注解,或检查 Ingress Controller ConfigMap 中 hsts 是否为 true(默认就是 true)
三、临时关闭 HSTS 并清理残留影响
仅停掉 HSTS 头还不够,因为浏览器缓存会持续生效:
- 服务端立即修改:将 HSTS 的 max-age 设为 0,例如
add_header Strict-Transport-Security "max-age=0; includeSubDomains";,然后重载 Nginx 或更新 Ingress 配置 - 客户端必须手动清除:回到 chrome://net-internals/#hsts,在 “Delete domain security policies” 区域输入域名,点 “Delete”
- 换无痕窗口验证:无痕模式不继承 HSTS 缓存,是最快验证是否生效的方式
四、警惕预加载风险
如果你的域名曾提交到 hstspreload.org 并被收录,即使清空本地缓存也无效。这种情况下:
- 无法通过客户端操作解除限制
- 只能等待官方列表更新(周期以月计)
- 或改用未预加载的新域名过渡











