误开HSTS导致HTTP资源无法访问,应立即清除浏览器HSTS缓存(Chrome/Edge用chrome://net-internals/#hsts、Safari在隐私设置中清理、Firefox改配置或删SiteSecurityServiceState.txt),临时禁用Nginx的HSTS响应头,并移除80端口301跳转,开发环境禁用HSTS并隔离配置。

开发测试环境误开 HSTS 后,浏览器会缓存该策略并强制跳转 HTTPS,导致 HTTP 接口、本地调试页、mock 服务等无法访问——这不是服务没起来,而是请求压根没发出去。核心思路是:快速清除浏览器端缓存 + 临时禁用服务端 HSTS 头,不改业务逻辑,也不等 max-age 过期。
立即清除浏览器 HSTS 缓存
这是最直接有效的第一步,尤其对本地开发调试:
- Chrome / Edge:在地址栏输入 chrome://net-internals/#hsts → 在 “Delete domain” 输入你的测试域名(如
localhost、test.example.com或具体 IP)→ 点击 Delete;再在 “Query domain” 中确认已消失 - Safari:进入 Safari → 设置 → 隐私 → 管理网站数据,搜索域名并移除全部记录(HSTS 信息随站点数据一并清除)
- Firefox:地址栏输入 about:config → 搜索
security.cert_pinning.enforcement_level→ 改为0(仅临时关闭证书钉扎影响),再清空缓存和 Cookie;更彻底的方式是删除SiteSecurityServiceState.txt文件(位于 Firefox 配置目录中) - 注意:
localhost默认不受 HSTS 影响(Chrome/Firefox 均明确排除),若出现拦截,大概率是用了自定义测试域名(如dev.test)且被 HSTS 记录了
临时停用 Nginx 的 HSTS 响应头
避免新设备或未清理缓存的同事再次中招,需从服务端源头移除 HSTS 头:
- 找到 HTTPS 的
server块(listen 443 ssl),删掉或注释掉这行:
add_header Strict-Transport-Security "max-age=...; includeSubDomains; preload" always; - 如果使用了全局 http 块统一注入安全头,检查是否在该作用域下误加了 HSTS;若有,直接删掉或用条件判断屏蔽开发环境:
if ($host ~* "^(dev|test|localhost)") { add_header Strict-Transport-Security "" always; } - 执行
nginx -t && nginx -s reload生效,无需重启进程
开发环境绕过 HTTPS 强制跳转
HSTS 本身只在 HTTPS 响应中生效,但很多团队会配套配置 80 端口 301 跳转,这会让 HTTP 请求还没到 HSTS 就被重定向卡住:
- 检查是否有独立的
server { listen 80; ... return 301 https://$host$request_uri; }块;开发环境建议直接注释或删除该块 - 若必须保留 80 端口监听(如联调需要),可改为返回 200 并透传请求:
location / { proxy_pass http://127.0.0.1:3000; proxy_set_header Host $host; } - 确保前端开发服务器(如 vite、webpack dev server)仍运行在 HTTP(如
http://localhost:5173),且不主动跳转 HTTPS
预防下次误开:区分环境配置
把 HSTS 严格限定在预发布/生产环境,开发测试环境默认不启用:
- 用 Nginx 变量或 include 分离配置,例如:
include /etc/nginx/conf.d/security-prod.conf;(含 HSTS)# include /etc/nginx/conf.d/security-prod.conf;(开发环境注释掉) - 在 CI/CD 流程中加入检查项:扫描所有 Nginx 配置文件,禁止
Strict-Transport-Security出现在dev、test、staging类环境标签的部署包中 - 本地开发推荐用
localhost+ 自签名证书(不配 HSTS),或明确使用无 HSTS 的子域(如dev-api.example.test),避免污染主测试域名


















