问题本质是浏览器HSTS策略主动拦截HTTP请求,未发请求故Nginx无301/302日志;排查分三步:一查chrome://net-internals确认HSTS是否生效,二用curl检查响应头是否含Strict-Transport-Security,三将max-age设为0并手动删除HSTS策略。

这个问题本质不是“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或Ingress是否仍在发送HSTS头
用curl模拟首次访问,重点看响应头里有没有Strict-Transport-Security:
- 如果是裸Nginx配置:检查server块中是否有类似 add_header Strict-Transport-Security "max-age=31536000; includeSubDomains"; 的行
- 如果是Kubernetes Ingress:查看对应Ingress资源的注解,或检查Ingress Controller ConfigMap中 hsts 是否为true(默认就是true)
- 执行 curl -I https://test.example.com,观察响应头输出。只要看到Strict-Transport-Security,就说明服务端还在“喂”浏览器这个策略
三、临时关闭HSTS并清理残留影响
仅停掉HSTS头还不够,因为浏览器缓存会持续生效:
- 服务端立即修改:将HSTS的max-age设为0,例如 add_header Strict-Transport-Security "max-age=0; includeSubDomains";,然后重载Nginx或更新Ingress Controller配置
- 客户端必须手动清除:回到 chrome://net-internals/#hsts,在“Delete domain security policies”区域输入域名,点“Delete”
- 换无痕窗口验证:无痕模式不继承HSTS缓存,是最快验证是否生效的方式
- 注意预加载风险:如果你的域名曾提交到 hstspreload.org 并被收录,即使清空本地缓存也无效,只能等官方列表更新或换域名
不复杂但容易忽略


















