SEO 百科
HSTS
本页目录
HSTS
HSTS 是一套机制,让浏览器只用 HTTPS 访问某个站点,站点通过 Strict-Transport-Security 响应标头来声明[1]。它的用处是堵住第一次明文请求留下的缺口,代价是规则一旦写进浏览器就很难收回。站长要权衡的是 max-age 设多长,以及要不要把规则也用到全部子域名。
它拦住的攻击
MDN 说明,这个标头用来告诉浏览器“应该只通过 HTTPS 访问该站点”[2]。RFC 6797 把要防的对象分成三类:被动监听者、主动篡改者、以及站点自身的部署错误[1]。
被动监听者只能看,主动篡改者还能改。RFC 把后者带来的问题称为点击穿透式的不安全,指用户面对证书错误时仍选择继续访问[1]。HSTS 的要求相反,遇到证书问题直接判为失败,不给继续的入口。
开启前后的差别
没有 HSTS 时,用户输入域名或者 http:// 地址,浏览器先发一次明文 HTTP 请求。服务器再把它跳到 HTTPS,可这次明文请求已经发完了,中间人有机会插手[2]。
开了 HSTS 之后,浏览器记住这个域名,之后所有 HTTP 请求自动换成 HTTPS,不再发那一次明文请求[2]。
标头有三个指令[2]。
max-age:浏览器记住只走 HTTPS 的秒数。includeSubDomains:规则同时覆盖全部子域名。preload:把域名写进浏览器内置的预加载列表。
一个常用的写法是:
Strict-Transport-Security: max-age=31536000; includeSubDomains
放到网络服务器上大致是:
add_header Strict-Transport-Security "max-age=31536000; includeSubDomains" always;
always 让这条标头在错误响应里也带上,证书报错时浏览器才能看到它。
规则难以撤回的原因
规则的落脚点在浏览器本地。只要 max-age 还没到期,浏览器就一直只走 HTTPS[2]。
开关放在浏览器手里。想关掉,要把 max-age 设成 0,而且这条响应必须通过 HTTPS 发出去[2]。HTTPS 一旦坏掉,这条响应就发不出去,规则也撤不掉。
preload 更难办。域名进了预加载列表之后,用户第一次访问也被强制走 HTTPS[2]。MDN 注明,这个列表由谷歌维护,所有浏览器都在用,但它不属于 HSTS 标准[2]。OWASP 提醒,预加载一旦生效,换回 HTTP 的代价可能是永久性的[3]。
与抓取和收录的关系
HSTS 在收录上的作用是帮 HTTPS 站稳规范网址。Google 建议实施 HSTS,用它保证系统优先选择 HTTPS 页面[4]。
这条建议有个前提:证书与跳转不能出错。Google 写明,错误的 TLS/SSL 证书会让它强烈偏好 HTTP,而且“实施 HSTS 无法覆盖这种强烈偏好”[4]。
风险落在 includeSubDomains 上。它把规则覆盖到全部子域名,某个只提供 HTTP 的子域名会被浏览器直接挡住,用户进不来,站点自己却未必马上察觉[2]。
采用面还不到一半。Web Almanac 2025 统计,移动端页面里带上 HSTS 标头的只有 36%[5]。用了标头的页面里,约四成同时开启 includeSubDomains,约两成带 preload[5]。统计口径是 HTTP Archive,覆盖范围有限。
常见误用
- 一上来就
preload。域名进列表后回退成本极高,先用短的max-age试跑。 - 忘了
includeSubDomains。规则只覆盖主域名,子域名上的明文连接照样能被插手[3]。 - 证书快到期还留着长的
max-age。证书一失效,浏览器连撤销用的那条响应都收不到。 - 以为开了 HSTS,爬虫就一定走 HTTPS。它主要写给浏览器看。
附录
参见
参考资料
官方(境外)
- 《HTTP Strict Transport Security (HSTS)》,IETF,2012-11。
- 《Strict-Transport-Security》,MDN Web 文档,2025-12-02 更新。
- 《HTTP Strict Transport Security Cheat Sheet》,OWASP。
- 《如何使用 rel="canonical" 及其他方法指定规范网址》,Google 搜索中心,2026-07-10 更新。
第三方
- 《Security》,HTTP Archive《Web Almanac 2025》,2026-01-15。
外部链接
无。