Nginx 配置 HSTS 预加载需在 HTTPS server 块中添加 add_header Strict-Transport-Security "max-age=31536000; includeSubDomains; preload" always;,并确保根域 HTTPS 可访问、全站 HTTPS 部署、301 重定向且无 HTTP 回退。

要在 Nginx 中配置 HSTS 并支持提交到浏览器的 HSTS 预加载列表(HSTS Preload List),关键在于正确设置 Strict-Transport-Security 响应头,且必须满足 Google 预加载列表的强制要求。
确保基础 HSTS 头完整且符合 preload 条件
HSTS 预加载有硬性要求,缺一不可。Nginx 中需添加如下响应头:
- max-age 至少为 31536000 秒(即 1 年)
-
必须包含
includeSubDomains(子域名继承 HSTS 策略) -
必须包含
preload(显式申请加入预加载列表) - 该站点必须能通过 HTTPS 正常访问,且所有重定向(包括 HTTP → HTTPS)必须使用 301,不能有 HTTP 回退
- 根域名(如 example.com)必须直接返回带 preload 的 HSTS 头,不能只在 www.example.com 上配
Nginx 配置示例(HTTPS server 块内)
在你的 server { listen 443 ssl; ... } 块中添加:
注意:
– 使用 always 参数确保即使返回 3xx/4xx/5xx 状态码也携带该头;
– 不要放在 HTTP server 块里(HTTP 下不发 HSTS 头);
– 若使用多个 server 块(如 www 和裸域),每个 HTTPS server 都应配置,尤其裸域(example.com)必须存在且有效。
验证与提交前必做检查
提交前务必确认以下几点:
- 用
curl -I https://example.com检查响应头是否含完整 HSTS 字段,无拼写错误、无多余空格 - 确保
example.com和www.example.com(如有)都可通过 HTTPS 访问,且证书有效 - 所有子域名(如 api.example.com、blog.example.com)都已部署 HTTPS,否则启用
includeSubDomains后将无法访问 - 访问 hstspreload.org 输入域名自动检测,绿色 ✅ 才表示满足提交条件
提交后注意事项
提交成功只是第一步:
- 预加载列表由 Chrome 维护,Firefox、Safari、Edge 均同步使用;审核通常需数周,期间状态可查
- 一旦被收录,用户首次访问就会强制走 HTTPS——即使输入 http://,浏览器也会自动改写为 https://
- 无法中途撤回:从预加载列表移除非常困难(需等数月甚至半年以上,且域名必须长期停用 HTTPS),请确保长期承诺全站 HTTPS
- 上线 preload 后,建议保留至少 18 个月,避免因临时下线导致子域名不可用











