启用HSTS预加载需满足全站HTTPS、max-age≥31536000秒、includeSubDomains、主域名443端口响应含preload头、80端口301重定向等硬性条件,并在Nginx的HTTPS server块中用always参数添加Strict-Transport-Security头。

要在 Nginx 中启用 HSTS 预加载(preload),不能只加一行头就提交,必须先满足浏览器预加载列表的硬性准入条件,并在配置中正确表达承诺。否则提交会被拒绝,或上线后引发子域不可访问等严重问题。
必须满足的硬性前提条件
preload 不是可选开关,而是向所有主流浏览器(Chrome、Firefox、Safari)发出的长期安全承诺。提交前必须同时满足:
- 全站(主域名 + 所有子域名)已稳定运行 HTTPS,且证书有效、可信
- max-age ≥ 31536000 秒(即 1 年),部分资料提到最低 10886400(126 天),但当前 hstspreload.org 实际要求为 31536000
- 响应头中必须包含 includeSubDomains,且所有一级子域(如 api.example.com、www.example.com)都已在 443 端口提供有效 HTTPS 服务
- 主域名的 HTTPS 响应头中必须带 preload 标记,且该响应必须来自 443 server 块(不能仅在 location 或 HTTP 块中)
- 80 端口必须配置 301 永久重定向到 HTTPS,不能是 302 或 JavaScript 跳转
Nginx 配置写法与位置要点
仅在 HTTPS 的 server { listen 443 ssl; ... } 块内添加,且必须使用 always 参数,确保 30X、40X、50X 等非 200 响应也携带 HSTS 头:
add_header Strict-Transport-Security "max-age=31536000; includeSubDomains; preload" always;
常见错误包括:
- 写在
http块或location块里 → 可能不生效或被覆盖 - 漏掉
always→ 404 页面不会发送 HSTS,导致预加载校验失败 - 子域未配置相同 HSTS 头 → 即使主站通过,mail.example.com 等子域若无 HTTPS 或无 HSTS,会直接导致 preload 拒绝
提交前自检与上线流程
不要跳过验证步骤。完成配置并 reload Nginx 后:
- 用
curl -I https://example.com确认响应头含完整 HSTS 字段(含 preload) - 逐一访问所有子域(如 https://api.example.com、https://shop.example.com),确认它们也返回相同 HSTS 头且证书有效
- 访问 hstspreload.org,输入主域名进行自动检测,全部绿勾才可提交
- 提交后需等待数天至数周审核;一旦收录,撤回需数月甚至半年以上,测试环境严禁启用 preload
建议分阶段推进
避免一步到位引发故障:
- 第一阶段:先配置
"max-age=300; includeSubDomains"(5 分钟),观察日志和用户反馈 - 第二阶段:逐步延长至
31536000,确认所有子域稳定 HTTPS 后再加入preload - 第三阶段:仅当 hstspreload.org 自检全通过,再正式提交


















