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