一聚教程网:一个值得你收藏的教程网站

最新下载

热门教程

Nginx 如何排查 Nginx 开启 HSTS 策略后测试完成后无法安全退出的故障

时间:2026-08-16 12:14:48 编辑:袖梨 来源:一聚教程网

答案是浏览器HSTS缓存导致无法访问HTTP。浏览器强制HTTPS且不发送HTTP请求,与Nginx运行状态无关;需通过chrome://net-internals/#hsts查询并删除策略,同时服务端将HSTS max-age设为0并重载配置。

这个问题本质不是 Nginx “卡住”或“无法退出”,而是浏览器记住了 HSTS 策略,后续所有 HTTP 请求被主动拦截、根本没发出去——所以你感觉“切不回 HTTP”,其实和 Nginx 当前是否运行、是否重启完全无关。

一、确认浏览器是否已缓存该域名的 HSTS 策略

打开 Chrome 或 Edge,地址栏输入:

chrome://net-internals/#hsts

在下方 “Query domain” 输入你的测试域名(如 test.example.com),点击 Query。

若显示 Found,说明浏览器本地已强制启用 HTTPS;若为 Not found,问题不在 HSTS 缓存,需另查。

二、检查服务端是否还在发送 HSTS 响应头

即使你改了配置,只要 Nginx(或 Ingress)仍在返回 Strict-Transport-Security 头,浏览器就会持续刷新缓存。验证方式:

  1. 执行 curl -I https://test.example.com,查看响应头中是否含 Strict-Transport-Security
  2. 若使用裸 Nginx:检查 server { listen 443 ssl; ... } 块中是否有 add_header Strict-Transport-Security ...
  3. 若使用 Kubernetes Ingress:检查 Ingress 注解(如 nginx.ingress.kubernetes.io/hsts: "true")或 Ingress Controller 的全局 HSTS 开关

三、安全退出 HSTS 的两个必要动作

仅停掉响应头还不够,必须同步清理客户端残留策略:

  1. 服务端操作:将 HSTS 的 max-age 改为 0,例如:

    add_header Strict-Transport-Security "max-age=0; includeSubDomains" always;

    然后重载 Nginx(nginx -s reload)或更新 Ingress 配置

  2. 客户端操作:回到 chrome://net-internals/#hsts,在 “Delete domain security policies” 区域输入域名,点 Delete
  3. 快速验证:用无痕窗口访问 http://test.example.com,若能正常加载,说明已生效

四、特别注意预加载带来的不可逆风险

如果你曾将域名提交至 hstspreload.org 并成功加入浏览器预加载列表,那么即使清空本地缓存、关闭服务端头,浏览器仍会永久强制 HTTPS——这种状态无法通过常规手段“退出”,只能等待最新移除(流程长、门槛高)。上线前务必避免对测试域名启用 preload

热门栏目