必须在443 HTTPS server块中配置add_header Strict-Transport-Security "max-age=31536000; includeSubDomains; preload" always,且全站及所有子域须HTTPS稳定、HTTP全301跳转、证书有效、错误页也带HSTS头,再经hstspreload.org审核通过方可预加载。

要在 Nginx 中为域名申请浏览器全局 HSTS 预加载(Preload),不能只靠加一行响应头。它是一套需全链路验证、不可逆的硬性承诺,核心是让主站及所有子域彻底脱离 HTTP 依赖,并通过 hstspreload.org 官方审核。
必须满足的硬性前置条件
浏览器预加载列表(Chrome、Edge、Firefox 共用)只接受完全符合规范的站点。缺一不可:
- 主域名和所有一级子域(如 www、api、cdn)都必须能独立响应 HTTPS 请求,且返回状态码为 2xx
- 所有 HTTP 请求(
http://example.com、http://api.example.com)必须返回 301 永久重定向 到对应 HTTPS 地址,禁止返回任何明文内容或 4xx 响应 - HTTPS 响应头中
Strict-Transport-Security必须同时包含:max-age=31536000(≥1 年)、includeSubDomains、preload - 所有响应(含 404、500、304、重定向页面)都必须携带该 HSTS 头——Nginx 中必须使用
always参数保证 - 所有涉及域名均需部署有效 TLS 证书(支持 TLS 1.2+,禁用弱加密套件),且不能使用自签名或过期证书
Nginx 中正确的配置写法
仅在启用 SSL 的 443 端口 server 块内添加,位置建议放在 ssl_certificate 之后、location 之前:
server {
listen 443 ssl;
server_name example.com www.example.com;
<pre class="brush:php;toolbar:false;">ssl_certificate /path/to/fullchain.pem;
ssl_certificate_key /path/to/privkey.pem;
# ✅ 正确:带 always,参数完整
add_header Strict-Transport-Security "max-age=31536000; includeSubDomains; preload" always;
# 其他配置...}
⚠️ 注意:
– 绝对不要写在 80 端口或 http{} 全局块中
– 禁止用 if ($scheme = https) { add_header ... },行为不可靠
– 不要依赖后端应用(如 Spring Boot、Node.js)再输出 HSTS 头,避免冲突
上线前必须完成的验证动作
配置 reload 后,逐项确认是否真正生效:
- 用
curl -I https://example.com和curl -I https://api.example.com分别检查响应头,确认都有完整 HSTS 字段 - 访问
https://example.com/404-test和https://example.com/500-error,确认错误页也返回该头 - 用
curl -I http://example.com验证是否返回 301,Location 值是否为https://example.com/... - 访问
https://www.php.cn/link/b9fcbc854cc45e5802618e283d3fe525/?domain=example.com,输入域名自动检测全部条件是否通过
提交与后续管理
检测通过后,进入 hstspreload.org 提交:
- 填写主域名(如
example.com),系统再次全量扫描 - 通过后点击 Submit,进入 Chromium 团队人工审核队列(通常数天至两周)
- 审核通过即写入预载列表,随浏览器更新分发;撤回需向 Chromium 提交 PR 并等待多个版本周期(通常 ≥3 个月)
- 上线后若需临时降级(如证书故障),只能等策略自然过期(max-age 时间),无法强制清除客户端缓存


















