hsts是抵御协议降级攻击的第一道硬性防线,必须在启用ssl的443端口server块中配置add_header strict-transport-security "max-age=31536000; includesubdomains; preload" always;,确保浏览器首次接收后自动强制https访问,杜绝ssl剥离与中间人劫持。

HSTS 不是“辅助手段”,而是对抗协议降级攻击的第一道硬性防线。它让浏览器在首次收到有效策略后,直接跳过 HTTP 请求环节,从根本上杜绝 SSL 剥离和中间人劫持的初始入口。
必须在 HTTPS server 块中配置
HSTS 头只在 HTTPS 响应中被浏览器接受,HTTP server(监听 80 端口)里加这行完全无效,还可能误导运维判断。Nginx 配置位置必须是明确监听 443、已启用 SSL 的 server 块内:
- 确认该 server 块含
listen 443 ssl;和有效的证书配置(ssl_certificate/ssl_certificate_key) - 不要写在全局 http 块或 upstream 段里——作用域错位会导致策略不生效
- 若使用 CDN(如 Cloudflare),需检查其是否透传自定义响应头;部分 CDN 默认过滤
Strict-Transport-Security,需在控制台开启“自定义头透传”或改用 CDN 原生 HSTS 开关
推荐的基础配置与参数含义
在对应 HTTPS server 块中添加这一行即可启动保护:
add_header Strict-Transport-Security "max-age=31536000; includeSubDomains; preload" always;- max-age=31536000:策略有效期为 1 年(31536000 秒),生产环境建议不低于 6 个月;太短起不到持续防护作用,太长则出错后回退周期长
-
includeSubDomains:子域名同步强制 HTTPS,启用前确保所有子域(如
api.example.com、cdn.example.com)均已部署有效证书并可稳定提供 HTTPS 服务 - preload:表示站点符合预加载要求,可提交至 hstspreload.org;一旦收录,所有主流浏览器启动即强制 HTTPS,不可逆,务必灰度验证后再启用
- always:关键参数,保证即使后端返回 404、502 或 302,HSTS 头仍会发出;缺了它,错误响应时策略中断,形成安全空档
上线前必须做的三件事
- 全站 HTTPS 彻底验证:用 curl 或在线工具(如 securityheaders.com)检查所有页面、API 路径、静态资源是否都走 HTTPS,无混合内容(Mixed Content)警告
-
小范围灰度测试:首次上线建议先设
max-age=300(5 分钟),观察 24 小时,确认无子域访问失败、无重定向循环、无证书错误再逐步延长 - 检查重定向逻辑是否冗余:HSTS 启用后,用户首次访问 HTTP 地址会被浏览器自动转 HTTPS;此时 Nginx 中的 80 → 443 重定向虽仍有必要(照顾旧书签和未缓存 HSTS 的用户),但不再承担“防降级”的核心任务
配置完成记得执行 nginx -t && nginx -s reload,然后在浏览器开发者工具 Network 标签页查看响应头是否出现该字段。真正起效不靠重启次数,而靠浏览器是否成功接收并缓存了这个头。











