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

验证 Nginx HSTS 是否满足浏览器预加载列表(如 Chrome 的 hstspreload.org)的合规要求,不能只看 header 是否存在,而要逐项确认真实运行状态是否达标。核心是“配置正确 + 行为闭环 + 全域一致”。
主站与所有子域必须全量 HTTPS 可达且证书有效
浏览器预加载审核会主动探测你声明的每一个子域(如 api.example.com、cdn.example.com、www.example.com)。只要任一子域:
- 返回 TLS 握手失败、证书过期、域名不匹配或自签名警告
- 响应超时(通常限 5 秒内完成 TLS 握手和 HTTP 响应)
- HTTP 状态码非 2xx/3xx(如直接返回 502、503 或连接拒绝)
整个提交就会被拒绝。验证方式:
- 用
curl -Iv https://subdomain.example.com检查是否成功建立 TLS 连接、返回 200/301/302,且无* SSL certificate problem报错 - 用
openssl s_client -connect subdomain.example.com:443 -servername subdomain.example.com验证证书链完整性
HSTS 响应头必须在所有 HTTPS 响应中完整出现
不只是首页,包括 404、500、304、301 等所有 HTTPS 响应都必须携带完整 HSTS 头。Nginx 默认只对 2xx 响应加 header,漏掉 always 参数是常见失败原因。
- 检查命令:
curl -I https://example.com/404-test和curl -I https://api.example.com/nonexistent - 响应头中必须严格包含:
Strict-Transport-Security: max-age=31536000; includeSubDomains; preload - 缺任意分号、空格错位、大小写混用(如
IncludeSubdomains)、或缺少always,都会导致检测失败
HTTP 请求必须 301 重定向到 HTTPS,且不返回任何明文内容
预加载要求“零 HTTP 明文出口”:所有 http:// 请求(含主域和每个子域)必须返回 301(不是 302),且响应体为空(不能有 HTML 页面、JSON、甚至 404 文本)。
- 验证方法:
curl -I http://example.com应返回HTTP/1.1 301 Moved Permanently+Location: https://example.com/ - 同样检查:
curl -I http://api.example.com、curl -I http://www.example.com - 若返回 200、404、或响应体含文字(哪怕只有一行
Redirecting...),即不合规
使用 hstspreload.org 官方检测器一次性验证全部条件
这是最权威、最贴近实际审核逻辑的验证方式。它会模拟 Chromium 团队的自动化检测流程:
- 访问 https://www.php.cn/link/b9fcbc854cc45e5802618e283d3fe525(注意是官网,非镜像或第三方)
- 输入你的主域名(如
example.com,不含https://或子域) - 点击 Check Domain,系统将自动探测:
→ 主站及所有已知子域的 HTTPS 可达性与证书有效性
→ 所有子域的 HTTP → HTTPS 301 重定向闭环
→ 每个 HTTPS 响应(含错误页)中的 HSTS 头完整性与always生效情况
→max-age是否 ≥ 31536000、是否含includeSubDomains和preload - 只有显示 “Ready for submission” 才表示全部通过;任何黄色警告或红色报错都需修复后重试


















