HSTS导致浏览器未发出HTTP请求,故Nginx日志为空;需通过chrome://net-internals/#hsts查询/删除策略,curl验证响应头,配置max-age=0清除,并警惕预加载的长期影响。

这个问题核心在于:浏览器已记住 HSTS 策略,根本没发出 HTTP 请求,所以 Nginx 日志里查不到 301/302,access.log 和 error.log 都是空的——不是服务端没响应,而是请求被前端“熔断”了。
一、确认浏览器是否已强制启用 HSTS
直接在 Chrome 或 Edge 地址栏输入:chrome://net-internals/#hsts
在下方 Query domain 输入你的域名(例如 test.example.com),点击 Query。
- 显示 Found → 浏览器本地已记录该域名的 HSTS 策略,
max-age值就是强制 HTTPS 的剩余秒数; - 显示 Not found → 问题不在 HSTS,需排查其他跳转逻辑(如 Nginx 的
return 301 http://或证书错误)。
二、检查服务端是否仍在下发 HSTS 响应头
即使你改了配置,旧策略可能还在生效。用 curl 验证真实响应:
curl -I https://test.example.com
观察输出中是否包含:Strict-Transport-Security: max-age=31536000; includeSubDomains
如果存在,说明服务端仍在“喂”浏览器这个头,需检查:
- Nginx 的
server或http块中是否有add_header Strict-Transport-Security ...; - 若用 Kubernetes Ingress,检查
ingress.kubernetes.io/hsts: "true"注解或 ConfigMap 中hsts: true设置; - 若用 Nginx Proxy Manager(NPM),进入对应主机设置 → SSL 选项卡 → 查看是否勾选了「启用 HSTS」。
三、停掉 HSTS 并清除客户端残留
仅注释 Nginx 配置不够,浏览器缓存会持续生效:
-
修改 Nginx 配置,将 HSTS 头设为失效:
add_header Strict-Transport-Security "max-age=0; includeSubDomains" always;
然后执行:
sudo nginx -t && sudo systemctl reload nginx 回到
chrome://net-internals/#hsts,在 Delete domain security policies 输入相同域名,点 Delete;关闭所有浏览器窗口,用无痕模式重新访问
http://test.example.com——无痕模式不继承 HSTS 缓存,是最快验证方式。
四、警惕 HSTS 预加载带来的长期影响
如果你的域名曾提交至 hstspreload.org 并被收录:
- 即使清空本地所有设置,Chrome、Edge、Firefox 启动时就会硬性强制 HTTPS;
- 客户端无法解除,只能等待官方列表更新(周期通常数周至数月);
- 临时调试建议:换一个未预加载的子域,例如
staging.test.example.com,单独配置、不启用 HSTS。


















