启用 includesubdomains 要求所有子域均部署有效 https 并配置一致 hsts 头,nginx 需在 https server 块中用 add_header strict-transport-security "max-age=31536000; includesubdomains" always; 且 http server 块必须 301 跳转至 https。

在 Nginx 中启用 includeSubDomains,本质是让 HSTS 策略不仅作用于主域名(如 example.com),也覆盖所有一级子域(如 www.example.com、api.example.com、shop.example.com 等)。但这个参数不是“开了就安全”,它要求你**所有子域都已部署 HTTPS 且稳定可用**,否则用户访问任意一个未配 HTTPS 的子域会直接失败。
必须满足的前提条件
加 includeSubDomains 前,请确认:
- 主域名和每一个实际使用的子域名(包括
www、api、cdn、mail等)均已配置有效 TLS 证书,且支持 TLS 1.2 或更高版本 - 所有子域的 HTTP 请求(
http://xxx.example.com)都必须返回301永久重定向到对应 HTTPS 地址,不能返回任何明文响应(含错误页) - 每个子域的 HTTPS 响应头中,
Strict-Transport-Security头必须一致包含includeSubDomains,且使用always参数确保错误状态码(如 404、500)也携带该头
Nginx 配置写法(HTTPS server 块内)
在监听 443 端口的 server 块中添加以下行:
注意要点:
-
max-age=31536000表示 1 年,这是申请浏览器预载表(preload)的最低要求;若暂不预载,可先设为31536000(1年)或15768000(6个月)过渡 -
always是关键:没有它,Nginx 默认不会给 3xx/4xx/5xx 响应加 HSTS 头,而预载审核明确要求错误页也必须携带 - 不要在 HTTP server 块中加这行——HSTS 只能通过 HTTPS 响应下发
配套的 HTTP 强制跳转(不可省略)
为确保所有流量进入 HTTPS,需在监听 80 端口的 server 块中做 301 跳转:
更稳妥的做法是单独处理 ACME 验证路径(如 Let’s Encrypt 自动续签):
- 把
/.well-known/acme-challenge/路径显式放行(允许 HTTP 访问) - 其余所有请求统一
return 301 https://$host$request_uri
验证是否生效
部署后,用浏览器开发者工具 → Network 标签页,访问任意子域的 HTTPS 页面,查看响应头中是否有:
Strict-Transport-Security: max-age=31536000; includeSubDomains也可用命令行快速检查:
curl -I https://example.com | grep Strict确保返回结果含 includeSubDomains,且无拼写错误或多余空格。











