HSTS 详解:max-age、preload,以及什么会出事
更新于 2026-11-03 · 6 分钟阅读
HSTS 是唯一一个能让站点彻底打不开的安全响应头——包括站主自己也打不开。它同时又是 A+ 的必要条件。这两件事之间的落差,完全取决于上线时的克制程度。
这个响应头到底做了什么
Strict-Transport-Security 告诉浏览器:在未来 N 秒内,这个主机只能通过 HTTPS 访问。一旦收到,浏览器就会改写页面里的 http:// 链接、屏蔽「继续访问」的证书错误按钮、直接拒绝明文 HTTP——这一切都发生在请求离开本机之前。
这正是它能防住重定向防不住的降级攻击的原因:重定向的第一次请求仍然是明文的,而那恰恰是网络上的攻击者想拦的那一个请求。
Strict-Transport-Security: max-age=31536000; includeSubDomains; preload
max-age 是一个你无法取消的倒计时
max-age 存在客户端。如果你下发了一年,之后又把这个响应头删掉,所有已经见过它的浏览器仍会强制 HTTPS,最长一年。服务端没有任何开关能立刻关掉它。
CertH 把 180 天(15552000 秒)当作 A+ 的门槛。一年是生产环境常见值。低于 180 天在摘要里仍算「已启用 HSTS」,但解锁不了 A+。
includeSubDomains 和 preload 是两个独立决定
includeSubDomains 把规则扩展到所有子域名。只要有一个子域名只支持 HTTP——内部工具、老后台、staging 主机——对访问过主域的任何人来说它就打不开了。先把 DNS 盘一遍。
preload 更进一步:域名会被写进浏览器内置的列表,规则在首次访问、还没收到任何响应头时就生效。撤销要几个月,还得提交到移除列表。在响应头稳定运行几个月之前,别加 preload。
- •每一个 HTTPS 响应都要带这个头,包括错误页——没有它的 404 教不会浏览器任何东西。
- •绝不要通过明文 HTTP 下发 HSTS;按规范浏览器会忽略它,所以配错的重定向循环没法用这招修。
- •加 includeSubDomains 之前,先检查子域名里有没有只支持 HTTP 的服务。
- •preload 放最后加,而且要等 max-age 稳定在一年的值之后。
一套不会弄坏任何东西的上线方式
先用很短的 max-age,让错误能很快过期:max-age=300。维持一周,盯住挂掉的子域名和混合内容报告。然后改成一天,再一个月,再一年。每一步都能在上一个时间窗口内回退——这正是「先短」的意义。
如果真出事了,正确的修法是让出问题的那个主机把 HTTPS 配好,而不是删响应头——删了也帮不到任何已经收到它的人。
FAQ
没有 HSTS 会扣分吗?
不扣基础分,但会挡住 A+:最高评级要求 HSTS 的 max-age 至少 180 天或已 preload。一个站点可以拿满分 100 分,但没有它仍然只是 A。
我并不拥有所有子域名,能用 HSTS 吗?
可以,只要不加 includeSubDomains。这样这个头只对下发它的那个确切主机生效。