strict-transport-security 必须由服务器在 https 响应头中配置,不能通过 标签设置;nginx 中需在 443 端口 server 块顶层用 add_header 加 always 参数;启用 preload 前须确保全站子域 https 就绪且 max-age≥31536000、含 includesubdomains。

Strict-Transport-Security 不是 HTML 中的配置项,不能写在 <meta> 标签里,也不受 HTML 解析影响。它必须由服务器在 HTTPS 响应头中发出,浏览器才会识别并缓存策略。
为什么 <meta http-equiv="Strict-Transport-Security"> 完全无效
首次 HTTP 请求到达时,HTML 还没开始解析,攻击者已可劫持连接;<meta> 是页面加载后才处理的 DOM 行为,此时明文通信早已发生。所有主流浏览器(Chrome、Firefox、Safari、Edge)明确忽略该用法,不作任何安全增强。
Nginx 中正确添加 Strict-Transport-Security 头
只允许在 HTTPS 的 server 块(监听 443 端口)中配置,HTTP 块加了也无意义——浏览器会直接丢弃。
-
add_header Strict-Transport-Security "max-age=31536000; includeSubDomains; preload" always;——always参数必须加,否则 304、4xx 等非 200 响应不带该头 - 不要放在
location /里,而应放在server块顶层,确保首页、API、静态资源等所有 HTTPS 响应都携带 - 首次上线建议先设
max-age=300(5 分钟),验证无资源加载失败后再逐步延长
启用 preload 前必须确认三件事
preload 不是开关,而是向浏览器厂商提交“永久强制 HTTPS”的申请动作,一旦收录无法撤回。
- 全站所有子域名(含
api.example.com、cdn.example.com)均已部署有效 TLS 证书且支持 HTTPS -
max-age≥31536000且必须带includeSubDomains,否则 hstspreload.org 拒绝收录 - 测试环境、自签名证书、localhost 域名严禁提交 preload —— 提交后新装浏览器将永远拒绝 HTTP 访问
验证 Strict-Transport-Security 是否生效
打开 Chrome DevTools → Network → 刷新页面 → 点击任意 HTTPS 请求 → 查看 Response Headers 中是否存在 Strict-Transport-Security 字段。若存在且值符合预期,说明服务端配置成功。
注意:浏览器只在收到 HTTPS 响应后才写入 HSTS 缓存,HTTP 响应里的该头会被静默忽略;本地测试时若曾访问过 HTTP 版本,需清空浏览器 HSTS 缓存(chrome://net-internals/#hsts)再验证。
真正难的不是加那行配置,而是确保全站 HTTPS 资源无一遗漏——少一个 http:// 的图片或脚本,HSTS 启用后用户就看到白屏或功能中断。
前端入门到VUE实战笔记:立即使用
在学习笔记中,你将探索 前端 的入门与实战技巧!











