hsts 是通过响应头强制浏览器仅用 https 访问域名的安全机制,需在 nginx 的 https server 块中配置 add_header strict-transport-security "max-age=31536000; includesubdomains; preload" always;,严禁在 http server 中设置,且需确保所有子域支持 https 并先小范围测试。

在 Nginx 中为网站启用 HSTS(HTTP Strict Transport Security),只需在 server 块中添加一条响应头即可,但配置不当可能引发访问异常,需特别注意生效范围与缓存策略。
什么是 HSTS 及其作用
HSTS 是一种安全策略机制,通过响应头告诉浏览器:“未来一段时间内,只允许通过 HTTPS 访问此域名”。它能有效防止 SSL 剥离攻击、HTTPS 降级攻击,避免用户误点 HTTP 链接导致明文传输。
一旦浏览器收到有效的 HSTS 头,就会自动将后续对该域名的 HTTP 请求转为 HTTPS,且该策略会被浏览器缓存,无需每次请求都校验。
基础配置方式(推荐)
在 Nginx 的 server 块(尤其是监听 443 端口的 HTTPS server)中添加如下指令:
说明:
- max-age=31536000:表示 HSTS 策略有效期为 1 年(单位秒),建议至少设为 31536000(1 年)以获得稳定保护
-
includeSubDomains:让策略对所有子域名也生效(如
api.example.com、www.example.com),启用前请确保所有子域均支持 HTTPS - preload:表示希望被加入浏览器 HSTS 预加载列表(需额外提交到 hstspreload.org),启用后不可轻易撤回
- always:确保即使返回 3xx、4xx、5xx 状态码时也发送该头(避免因错误响应丢失策略)
必须避开的常见错误
HSTS 配置看似简单,但以下几点极易出错:
- 不要在 HTTP server(80 端口)中设置 HSTS 头——浏览器会忽略非 HTTPS 响应中的 Strict-Transport-Security
- 不要在未启用 HTTPS 的站点上开启
includeSubDomains,否则子域名若无 HTTPS 将彻底无法访问 - 首次上线建议先用较小的
max-age(如 300 秒)测试,确认全站 HTTPS 稳定后再延长 - 若使用 CDN(如 Cloudflare),需确认 CDN 是否透传或覆盖了该 Header;部分 CDN 默认不透传自定义 Header,需单独开启
验证是否生效
配置完成后重启 Nginx(nginx -t && nginx -s reload),然后通过以下方式验证:
- 访问网站,在浏览器开发者工具的 Network → Response Headers 中查找
Strict-Transport-Security - 使用在线检测工具,如 securityheaders.com 或 hstspreload.org
- 在 Chrome 地址栏输入
chrome://net-internals/#hsts,查询域名是否已记录 HSTS 策略










