延长HSTS缓存时间本质是增大max-age值,但需权衡安全与可维护性:首次上线建议从300秒起步,稳定后逐步增至31536000秒(1年);Nginx中须在443 server块内配置并加always参数,includeSubDomains和preload需谨慎启用。

要延长 HSTS 的强制 HTTPS 缓存时间,本质是增大 max-age 值——它决定浏览器记住“只走 HTTPS”这条规则的时长。但这个值不是越大越好,必须兼顾可维护性与安全性。
max-age 设置原理与推荐值
max-age 是以秒为单位的相对时间,浏览器收到含该字段的 Strict-Transport-Security 响应头后,会从那一刻起,在本地记录该策略并严格执行 HTTPS 重写,直到过期。
- 常见生产值:31536000(即 1 年),足够稳定又留有回旋余地
- 首次上线建议先用 300(5 分钟)或 86400(1 天)验证跳转、证书、子域兼容性
- 设为 0 表示撤销策略,但需配合客户端手动清理,不能单靠服务端改配置
Nginx 配置位置与关键细节
HSTS 头必须在 HTTPS 响应中稳定下发,否则浏览器不会记录。错误的位置会导致部分路径失效(如 404 页面不带 HSTS,用户就可能被“漏掉”)。
- 必须放在
server { listen 443 ssl; }块内,不能写在http或顶层location - 务必加上
always参数:add_header Strict-Transport-Security "max-age=31536000; includeSubDomains" always;,否则 4xx/5xx 响应不携带该头,策略中断 - 若使用
includeSubDomains,所有子域名都受约束;若后续有 HTTP 子服务(如内网测试页),需谨慎评估
延长 max-age 后的实际效果
延长不是“立刻生效”,而是影响新访问用户的缓存周期。已记录旧策略的用户,其本地计时器仍按原 max-age 走;只有收到新响应头,才会刷新倒计时。
- 用户首次访问时收到
max-age=31536000,浏览器将锁定 HTTPS 约 1 年 - 期间哪怕你临时关掉 HTTPS 或证书过期,浏览器也会拦截请求、不发包、直接报错(如 ERR_SSL_PROTOCOL_ERROR)
- 没有“提前失效”机制,只能等自然过期,或主动用
max-age=0+ 手动清除客户端记录来干预
要不要加 preload?
preload 是把域名提交进浏览器内置 HSTS 列表(如 Chrome 的 hstspreload.org),让首次访问也强制 HTTPS。但它带来更高门槛:
- 提交前必须满足:主域 + 所有子域均支持 HTTPS、
max-age ≥ 31536000、含includeSubDomains和preload - 一旦收录,移除需重新申请,审核周期常达数月,且无法立即生效
- 普通业务不建议轻易启用;高安全要求、长期稳定 HTTPS 的官网可考虑


















