hsts导致浏览器强制https而无法访问http地址;可通过chrome://net-internals/#hsts查询/删除策略,curl验证响应头,nginx注释add_header并重载,无痕窗口测试;若域名已预加载则需换子域调试。

这其实不是 Nginx 没配好,而是浏览器已经“记住”了你的 HSTS 策略,但当前访问没走 HTTPS,导致它压根不发请求——连 301 跳转都看不到,地址栏自然卡在 http://。
确认 HSTS 是否已在浏览器生效
直接在 Chrome 或 Edge 地址栏输入:
chrome://net-internals/#hsts
在下方 “Query domain” 输入你的测试域名(比如 test.example.com),点 Query。
如果返回 Found,说明浏览器已强制 HTTPS;若显示 Not found,问题不在 HSTS,要另查其他跳转逻辑或证书配置。
检查 Nginx 是否还在发送 HSTS 响应头
即使你改了配置,旧的 HSTS 头可能仍被返回。用 curl 验证实际响应:
- 执行
curl -I https://test.example.com - 查看输出中是否含 Strict-Transport-Security 字样
- 如果存在,检查 Nginx 的
server或http块里是否有add_header Strict-Transport-Security ...;K8s Ingress 用户还要查注解或 Controller ConfigMap 中 hsts 是否启用
停掉 HSTS 并清空客户端缓存
只删配置不够,浏览器本地缓存会持续生效:
- 先注释或删除 Nginx 中的
add_header Strict-Transport-Security行,然后sudo nginx -t && sudo systemctl reload nginx - 回到 chrome://net-internals/#hsts,在 “Delete domain security policies” 输入相同域名,点 Delete
- 立即用无痕窗口打开测试链接——无痕模式不继承 HSTS 缓存,是最快验证方式
警惕预加载列表的长期影响
如果你的域名曾提交到 hstspreload.org 并被收录,即使清空所有本地设置,主流浏览器启动时仍会硬性强制 HTTPS。这种情况下:
- 无法通过客户端操作解除
- 只能等官方列表更新(周期数周至数月)
- 临时方案:换一个未预加载的测试子域(如 staging.test.example.com)做调试











