网站已经配置好 SSL 证书,CDN 或服务器面板里往往还会提供一个 HSTS 开关。
开启之后有什么变化?为什么有的网站关闭了这个选项,浏览器仍然自动访问 HTTPS?为什么主站正常,某些子域名却打不开?
这些问题与 HSTS 的生效范围和有效期有关。本文介绍它的作用、配置方法,以及上线和回退时需要检查的内容。
1. HSTS 有什么作用
HSTS 的全称是 HTTP Strict Transport Security,即 HTTP 严格传输安全。
网站通过 HTTPS 响应中的 Strict-Transport-Security 字段,告诉浏览器:在指定时间内,访问这个域名必须使用 HTTPS。
浏览器记住策略后,即使用户点击 HTTP 链接,也会先将地址升级为 HTTPS。遇到证书错误时,也不会提供普通的忽略警告继续访问选项。
它与网站的 HTTP 跳转配置作用不同:
| 配置 | 主要作用 |
|---|---|
| HTTPS | 为网站提供加密连接 |
| HTTP → HTTPS 跳转 | 服务器收到 HTTP 请求后,通知客户端访问 HTTPS |
| HSTS | 浏览器已有有效策略时,在发出 HTTP 请求之前升级地址 |
因此,HSTS 适合已经能够稳定提供 HTTPS 的网站。它不能代替证书安装、续期和网站本身的安全维护。
2. 先看懂三个常见参数
下面是一条用于短期测试的响应头:
Strict-Transport-Security: max-age=300
其中,300 的单位是秒,表示浏览器记住策略的时间为 5 分钟。
常见参数如下:
| 参数 | 含义 |
|---|---|
max-age | 浏览器保存策略的有效期,单位为秒 |
includeSubDomains | 将策略扩展到当前域名的所有下级子域名 |
preload | 与浏览器预加载名单相关,并不是普通 HSTS 必须添加的参数 |
例如,在 example.com 上启用 includeSubDomains,会影响 www.example.com、api.example.com 等子域名;只在 www.example.com 设置策略,不会反向覆盖 example.com。
初次配置时,可以先针对已经验证好的域名使用较短的 max-age,确认业务正常后逐步延长。
不要直接复制带有一年有效期、includeSubDomains 和 preload 的配置。预加载需要长期维护整个域名体系的 HTTPS,退出名单也不是即时生效。
3. 开启前检查 HTTPS 和子域名
建议先检查以下项目:
| 检查项目 | 需要确认的内容 |
|---|---|
| 在线证书 | 证书未过期,域名匹配,证书链正常 |
| 页面功能 | 登录、上传、支付和接口请求能够正常完成 |
| 子域名 | 后台、下载站、API 和旧站点是否支持 HTTPS |
| CDN 入口 | 用户实际访问的节点使用有效证书 |
| 后续维护 | 证书续期、域名迁移和故障处理有人负责 |
如果使用 CDN,不能只检查源站证书。用户浏览器实际连接的是 CDN 节点,节点上的证书和 HTTPS 配置同样需要正常。开启 HSTS 后,也应避免把访问入口切换到无法提供有效 HTTPS 的服务器。
旧管理入口还需要特别留意。例如:
http://panel.example.com:8080
当该域名被有效的 HSTS 策略覆盖时,浏览器会尝试:
https://panel.example.com:8080
这里的 8080 不会自动变成 443。如果该端口只提供 HTTP,访问就可能失败。
如果遇到证书已经更换,但访问时仍显示旧证书的情况,可以先参考本站的 SSL证书更新后仍显示旧证书排查教程。
先把 HTTPS 问题解决,再开启 HSTS。

4. Nginx 和 CDN 如何配置 HSTS
4.1 在 Nginx 中添加响应头
以下操作以已经能够正常访问 HTTPS 的 Nginx 网站为前提。
打开当前域名对应的 HTTPS server 配置,在其中添加:
add_header Strict-Transport-Security "max-age=300" always;
如果已经存在同名配置,应修改原来的配置,避免重复添加。
这里先使用 5 分钟有效期,并且不添加 includeSubDomains 和 preload,便于验证当前域名的实际影响。
always 用于让响应头不受常规状态码范围的限制。还要注意 Nginx 的默认继承规则:某个 location 自己配置了 add_header 时,可能不会继承上层的 HSTS 配置。新增配置时,也要保留原来需要继承的其他响应头。
对于通过系统服务管理的 Nginx,保存后执行:
sudo nginx -t && sudo systemctl reload nginx
只有配置检查成功,才会执行重载。
如果使用面板或容器管理 Nginx,应通过对应实例的配置检查和重载方式操作,避免修改的配置与实际运行的服务不是同一个。
4.2 逐步延长有效期
测试阶段应检查实际业务页面,而不只是确认首页能打开。
例如:
- 用户能否正常登录。
- 文件上传和下载是否正常。
- 页面调用的接口是否正常。
- 旧链接和管理入口是否仍可使用。
确认业务稳定后,再分阶段延长 max-age,并留出完整的观察期。短期测试值适合验证配置,不应一直作为正式部署的最终方案。
4.3 使用 CDN 时怎么处理
如果 CDN 控制台提供 HSTS 设置,可以在对应域名的 HTTPS 或安全配置中管理。
重点核对:
- 实际生效的是哪个域名。
max-age的单位和可选范围。- 是否开启了对子域名的覆盖。
- 是否额外启用了预加载相关选项。
不同面板支持的有效期范围不一样,不一定能直接填写 300。
建议明确由哪一层负责输出 HSTS 响应头,避免 CDN、源站和应用分别添加不同的值。最终应检查公网域名实际返回的响应,而不是只看控制台开关。
5. 如何检查 HSTS 是否配置成功
在 Linux 终端执行以下命令,将示例域名替换为自己的域名:
curl -sS --max-time 20 -D - -o /dev/null \
https://www.example.com/
命令会显示响应头,并丢弃页面正文。检查结果中是否包含:
Strict-Transport-Security: max-age=300
响应头名称不区分大小写,显示为小写也正常。
验证时不要添加 -k。该选项会跳过证书校验,不适合用来确认 HTTPS 是否已经正确部署。
还应检查以下情况:
- 如果返回跳转,根据
Location检查目标地址,并分别核对入口和最终页面。 - 分别检查首页、登录页和主要业务路径。
- 使用 CDN 时,确认检查的是实际对外域名。
- 确认没有重复或相互冲突的 HSTS 响应头。
看到响应头,能够证明这次响应携带了策略;仅仅看到浏览器自动跳转 HTTPS,并不能单独证明 HSTS 配置成功,因为网站本身也可能设置了跳转规则。
6. 为什么关闭 HSTS 后仍然跳转 HTTPS
HSTS 策略会保存在浏览器中。
直接从服务器配置中删除响应头,并不会通知浏览器立即删除以前保存的策略。此前的有效期尚未结束时,浏览器仍可能继续强制使用 HTTPS。
而且,每次收到新的有效 HSTS 响应头,浏览器都会更新策略的到期时间,并不是从第一次开启时固定倒计时。
需要撤销当前域名的动态策略时,可以将原配置改为:
add_header Strict-Transport-Security "max-age=0" always;
检查并重载后,确认 HTTPS 响应包含:
Strict-Transport-Security: max-age=0
浏览器需要再次成功通过 HTTPS 访问,并收到这个响应头,才能处理撤销。没有再次访问的客户端,不会凭空收到服务器的配置变化。
另外还要区分两种情况:
- 受到父域名策略覆盖: 子域名发送
max-age=0,不能取消父域名仍然有效的includeSubDomains策略。 - 已经进入预加载名单: 删除
preload或修改响应头,不等于立即从用户浏览器内置的名单中移除。
回退期间应继续提供有效的 HTTPS,不要在删除配置后立即撤掉证书或关闭 HTTPS 服务。

7. 上线后还需要维护什么
HSTS 开启后,建议把以下事项纳入日常维护:
- 检查证书续期是否正常。
- 监测 HTTPS 网站的可用性。
- 新增子域名时,确认是否受到父域名策略覆盖。
- 更换 CDN 或迁移服务器前,验证新入口的证书和业务功能。
- 保存当前策略值,方便后续排查和调整。
需要搭建网站监控,可以参考本站的 Docker搭建Uptime Kuma网站监控教程。
如果需要单独验证 Nginx 配置或网站迁移方案,可以准备一台莱卡云 Linux 云服务器作为测试环境,完成验证后再调整正式站点。
查看官网购买链接: https://www.lcayun.com
9折优惠码:bloglcayun
8. 结语
HSTS 能让浏览器在策略有效期间坚持使用 HTTPS,适合已经完成 HTTPS 部署并能持续维护证书的网站。
实际配置时,先确认在线证书和业务功能,再检查子域名范围,从较短的有效期开始验证。配置完成后检查真实响应头,后续迁移或关闭功能时,也要考虑浏览器中已经保存的策略。
把生效范围、有效期和维护安排弄清楚,才能让 HSTS 在增强访问安全的同时,保持网站稳定运行。







