Strict-Transport-Security(HSTS)是浏览器强制使用HTTPS访问网站的安全策略;收到该响应头后,浏览器在max-age指定时间内自动将所有HTTP请求升级为HTTPS,绕过301跳转,防止SSL Stripping等中间人攻击,并可选通过includeSubDomains扩展至一级子域名。

Strict-Transport-Security 是什么
Strict-Transport-Security(HSTS)是浏览器强制使用 HTTPS 访问网站的安全策略。一旦浏览器收到带 HSTS 头的响应,就会在指定时间内自动将所有 HTTP 请求升级为 HTTPS,绕过 301 跳转,防止 SSL Stripping 等中间人攻击。
includeSubDomains 的真实作用
开启 includeSubDomains 后,HSTS 策略不仅作用于当前域名(如 example.com),还会覆盖所有一级子域名(如 www.example.com、api.example.com、cdn.example.com)。但注意:它不递归生效,比如 foo.bar.example.com 不会被包含。
启用前必须确保所有子域名都已支持 HTTPS 且证书有效,否则用户访问这些子域名会直接失败(浏览器拒绝加载)。
Nginx 配置 includeSubDomains 的正确写法
在 server 块中添加如下指令(推荐放在 HTTPS server 块内):
add_header Strict-Transport-Security "max-age=31536000; includeSubDomains; preload" always;
- max-age=31536000 表示有效期 1 年(建议从 300 或 3600 开始测试,确认无误后再调高)
- includeSubDomains 必须与分号紧邻,前后不留空格
- preload 是可选参数,用于申请加入浏览器 HSTS Preload List,需满足额外条件(如根域名必须响应 HTTPS、必须包含 includeSubDomains、max-age ≥ 31536000 等)
- always 参数很重要:确保即使返回 304、404、500 等非 2xx 响应,HSTS 头依然生效
上线前必须做的三件事
- 逐个验证所有子域名是否能通过 HTTPS 正常访问(用 curl -I https://sub.example.com 检查状态码和证书)
- 先用较小的 max-age(如 300 秒)上线观察 10–15 分钟,确认主站和各子域名无混合内容、跳转异常或证书错误
- 检查 Nginx 日志中是否有子域名因证书问题被拒绝的请求(重点关注 ssl_handshake_failed、no suitable certificate 等关键词)


















