HTTP严格传输安全协议怎么组装?HSTS配置方法详解
- 云服务器
- 2026-07-05
- 6
HTTP严格传输安全协议(HSTS, HTTP Strict Transport Security)是一种Web安全策略机制,它允许Web服务器告知浏览器只能通过HTTPS连接与该服务器进行通信,组装HSTS头部的核心在于正确构建HTTP响应头字段 Strict-Transport-Security。
以下是组装HSTS协议的详细步骤、参数说明及最佳实践。
HSTS头部的基本结构
HSTS头部是一个标准的HTTP响应头,其基本语法如下:
Strict-Transport-Security: <max-age>; includeSubDomains; preload
<max-age> 是必填项,其余两个参数(includeSubDomains 和 preload)是可选的。
参数详解与组装规则
在组装HSTS头部时,需要理解每个参数的具体含义和作用范围。

| 参数名称 | 是否必填 | 说明 | 示例值 |
|---|---|---|---|
| max-age | 是 | 指定浏览器应记住该策略的时间长度(以秒为单位),在此时间内,浏览器将强制使用HTTPS访问该域名。 | max-age=31536000 (1年) |
| includeSubDomains | 否 | 如果包含此参数,HSTS策略将应用于该域名下的所有子域名。 | includeSubDomains |
| preload | 否 | 如果包含此参数,表示网站希望被添加到浏览器的HSTS预加载列表中,一旦加入,即使从未访问过该网站,浏览器也会强制使用HTTPS。 | preload |
组装逻辑说明:
-
确定有效期 (max-age):
- 建议设置为至少 31536000 秒(1年)。
- 如果设置为 0,则相当于删除HSTS策略。
- 如果设置为 0 后想重新启用,浏览器会忽略该请求,直到重新收到一个非零的 max-age。
-
决定是否覆盖子域名 (includeSubDomains):
- 如果你的网站有多个子域名(如 api.example.com, blog.example.com),且都启用了HTTPS,建议添加此参数,以确保整个域名的安全性。
- 如果某些子域名仍在使用HTTP或尚未配置SSL证书,则不要添加此参数,否则会导致这些子域名无法访问。
-
决定是否申请预加载 (preload):
- 这是一个高级选项,只有当你确信所有子域名都已正确配置HTTPS,并且希望获得最高级别的安全保护(防止首次访问时的SSL剥离攻破)时,才添加此参数。
- 添加此参数后,需要向主流浏览器(Chrome, Firefox, Safari等)提交预加载列表申请。
常见组装示例
示例 1:基础HSTS配置
仅设置有效期为1年,不覆盖子域名,不预加载。
Strict-Transport-Security: max-age=31536000
示例 2:覆盖所有子域名
设置有效期为1年,并应用于所有子域名。

示例 3:完整HSTS配置(推荐用于生产环境)
设置有效期为1年,覆盖所有子域名,并申请预加载。
Strict-Transport-Security: max-age=31536000; includeSubDomains; preload
服务器配置实现方式
HSTS头部需要在Web服务器返回的HTTP响应中设置,以下是几种常见服务器的配置方法:
Nginx 配置
在 server 块或 location 块中添加:

add_header Strict-Transport-Security "max-age=31536000; includeSubDomains; preload" always;
注意:always 参数确保即使响应状态码是错误码(如4xx, 5xx),也会发送该头部。
Apache 配置
使用 mod_headers 模块:
Header always set Strict-Transport-Security "max-age=31536000; includeSubDomains; preload"
IIS 配置
在 web.config 文件中:
<system.webServer> <httpProtocol> <customHeaders> <add name="Strict-Transport-Security" value="max-age=31536000; includeSubDomains; preload" /> </customHeaders> </httpProtocol> </system.webServer>
注意事项与最佳实践
- 首次访问问题:HSTS策略是在浏览器收到包含HSTS头部的HTTPS响应后生效的,用户第一次访问网站时,如果通过HTTP进入,可能会遭受SSL剥离攻破,这就是为什么需要 preload 列表的原因。
- 子域名一致性:如果使用了 includeSubDomains,请确保所有子域名都支持HTTPS,否则,用户访问不支持HTTPS的子域名时会看到错误页面。
- 不要过早启用预加载:在提交预加载列表之前,请确保你的网站已经稳定运行HTTPS至少一周,并且所有子域名都已正确配置,一旦加入预加载列表,很难移除,且可能导致部分用户无法访问。
- :即使启用了HSTS,如果页面中加载了HTTP资源(如图片、脚本),浏览器仍可能发出警告,应确保所有资源都通过HTTPS加载。
相关问题与解答
问题 1:如果我在HSTS头部中设置了 max-age=0,会发生什么?
解答:
当浏览器收到 Strict-Transport-Security: max-age=0 时,它会立即删除之前为该域名存储的HSTS策略,这意味着:
- 浏览器将不再强制该域名使用HTTPS。
- 用户可以重新通过HTTP访问该网站。
- 重要提示:如果网站之前已经启用了HSTS预加载(preload),仅靠设置 max-age=0 无法立即从浏览器的预加载列表中移除,预加载列表是硬编码在浏览器中的,需要向浏览器厂商申请移除,这个过程可能需要数周甚至数月,在移除HSTS策略前,务必确认是否已申请从预加载列表中移除。
问题 2:为什么有些网站在首次访问时仍然会被重定向到HTTPS,即使没有HSTS预加载?
解答:
这通常是因为网站配置了HTTP到HTTPS的301重定向,而不是依赖HSTS。
- HSTS的作用:是在浏览器已经访问过该网站并收到HSTS头部后,在后续访问中强制使用HTTPS,防止首次访问时的中间人攻破。
- 301重定向的作用:是在每次通过HTTP访问时,服务器立即返回301状态码,告诉浏览器“请去HTTPS地址”。
- 区别:HSTS更安全,因为它防止了首次访问时的SSL剥离攻破;而301重定向在首次访问时,浏览器仍然会发送一个HTTP请求,存在被截持的风险,最佳实践是同时使用301重定向(用于兼容性)和HSTS(用于长期安全),并尽可能申请预加载。