HSTS通过HTTPS响应头Strict-Transport-Security强制浏览器仅用HTTPS访问,核心是“记忆型安全锁”;配置前须确保SSL证书有效、HTTPS服务正常、headers模块启用,且必须在443端口server块中添加含always参数的响应头。

直接在服务器HTTPS响应头中添加Strict-Transport-Security,是让浏览器强制走HTTPS的核心动作。它不是跳转指令,而是“记忆型安全锁”——一旦接收,浏览器会在本地缓存策略,在有效期内自动把所有HTTP请求改写为HTTPS,连地址栏输http://也会瞬间变https://。
配置前必须确认的三件事
缺一不可,否则HSTS根本不会生效:
- 站点已部署有效且受信的SSL/TLS证书(自签名、过期或域名不匹配的证书会导致浏览器拒绝加载HSTS)
- Web服务器(如Nginx/Apache)已启用HTTPS虚拟主机,443端口服务正常响应
- mod_headers(Apache)或headers模块(Nginx)已加载并启用,否则Strict-Transport-Security头发不出去
主流服务器配置写法(仅限HTTPS块内)
HSTS头只能且必须通过加密连接发送,绝不能出现在HTTP(80端口)配置中:
Nginx是一款高性能的开源软件,由俄罗斯开发者Igor Sysoev于2004年创建。它最初设计为高效的HTTP Web服务器,现已成为最受欢迎的Web服务器之一。Nginx以事件驱动、非阻塞I/O架构著称,能以极低内存占用处理数万并发连接,特别适合高流量场景。它同时担任反向代理、负载均衡器、HTTP缓存、TCP/UDP代理等多重角色,常用于静态文件服务、SSL终止、请求转发、API网关和微服务
-
Nginx:在
server { listen 443 ssl; ... }块中添加add_header Strict-Transport-Security "max-age=31536000; includeSubDomains" always; -
Apache:在
<VirtualHost *:443>内添加Header always set Strict-Transport-Security "max-age=31536000; includeSubDomains" -
关键细节:
always参数确保3xx/4xx/5xx错误响应也携带HSTS头;includeSubDomains要等所有子站(如api.example.com、cdn.example.com)都支持HTTPS后再开启
安全上线节奏:从测试到生产
别一上来就设1年有效期——出问题很难回滚:
- 首次上线用
max-age=300(5分钟),验证浏览器是否真能自动跳转HTTPS - 确认无误后,逐步延长:
86400(1天)→2592000(30天)→ 最终到31536000(1年) - 若需加入浏览器预加载列表(preload),必须满足:max-age ≥ 31536000 + includeSubDomains + 全站HTTPS重定向兜底,再提交至hstspreload.org
失效与调试的现实路径
HSTS一旦缓存,服务器端无法远程清除:
- 用户端可手动清理:
Chrome输入chrome://net-internals/#hsts→ 删除域名;
Firefox需清除“Cookie和网站数据” - 若想停用HSTS,唯一可靠方式是返回
max-age=0响应头(仅对尚未缓存的新用户生效) - 常见故障点:CDN未同步HSTS头、服务器时间偏差超证书有效期、测试环境误开HSTS导致全员访问失败

















