必须满足5项硬性前提:全站https重定向、有效tls证书、hsts头含max-age=31536000;includesubdomains;preload且带always参数、所有子域合规、通过hstspreload.org检测。

要在 Nginx 中配置 HSTS 的 preload 参数,让域名正式加入 Chrome、Firefox、Safari 等浏览器的内置 HSTS 预加载列表(如 hstspreload.org),不能只加一行 header——它是一份长期安全承诺,必须满足一整套硬性条件,缺一不可。
必须满足的 5 项前提条件
提交前务必逐项确认全部成立:
- 全站 HTTPS:主域名(如 example.com)和所有子域(api.example.com、www.example.com、cdn.example.com 等)均部署有效 TLS 证书,支持 TLS 1.2+,禁用 SSLv3、RC4、SHA1 等弱协议和加密套件
- HTTP 全量 301 重定向:所有 HTTP 请求(包括 http://example.com 和 http://any-sub.example.com)必须返回 301 永久重定向 到对应 HTTPS 地址,不能返回任何明文内容(连 404、500 页面也不允许)
- HSTS 头完整且带 always:HTTPS 响应头中 Strict-Transport-Security 必须严格包含 max-age=31536000; includeSubDomains; preload,且 add_header 指令必须加 always 参数,否则错误页(4xx/5xx)不携带该头
- 所有子域 HTTPS 可达且合规:每个子域的 HTTPS 站点必须能正常访问,响应头与主站一致,且通过 hstspreload.org 自动检测
- 根域名可直接访问 HTTPS:不能仅靠 www.example.com 提供服务;example.com(裸域)本身必须可通过 HTTPS 正常访问并返回合规 HSTS 头
Nginx 配置写法(关键细节)
仅在 HTTPS server 块(即 listen 443 ssl 的块)内添加,不要写在 HTTP 块或 location 内:
add_header Strict-Transport-Security "max-age=31536000; includeSubDomains; preload" always;
常见错误写法会导致审核失败:
- 漏掉 always → 404、500 页面不发 HSTS 头
- 写在 HTTP server 块里 → 完全无效,甚至可能引发安全警告
- 只在主站配,子域 server 块没重复添加 → 子域响应缺失 preload 或 includeSubDomains
- max-age 小于 31536000(即不足 1 年)→ hstspreload.org 直接拒绝
验证与提交流程
配置生效后,按顺序操作:
- 用 curl 检查每个 HTTPS 域名是否返回完整头:
curl -I https://example.com和curl -I https://api.example.com,确认 Strict-Transport-Security 行完整出现 - 访问 https://www.php.cn/link/b9fcbc854cc45e5802618e283d3fe525,输入你的主域名(如 example.com)
- 系统自动检测全部条件(证书有效性、重定向行为、HSTS 头完整性、子域可达性等)
- 检测通过后点击 Submit,进入 Chromium 团队人工审核队列(通常需数天至两周)
注意事项与风险提示
preload 是高风险动作:
- 一旦加入预加载列表,所有主流浏览器首次访问就会强制走 HTTPS,无法通过清除缓存撤销
- 撤回需向 Chromium 提交移除申请,审核周期长,且期间仍受策略约束
- 若未来某天无法提供 HTTPS 服务(如证书过期、配置变更、子域下线),用户将完全无法访问
- 建议先上线不含 preload 的 HSTS(如 max-age=31536000; includeSubDomains),稳定运行至少 1–2 个月后再申请 preload











