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。它主要写给浏览器看。

附录

参见

参考资料

官方(境外)

  1. 《HTTP Strict Transport Security (HSTS)》,IETF,2012-11。
  2. 《Strict-Transport-Security》,MDN Web 文档,2025-12-02 更新。
  3. 《HTTP Strict Transport Security Cheat Sheet》,OWASP。
  4. 《如何使用 rel="canonical" 及其他方法指定规范网址》,Google 搜索中心,2026-07-10 更新。

第三方

  1. 《Security》,HTTP Archive《Web Almanac 2025》,2026-01-15。

外部链接

无。