全站HTTPS强制跳转与HSTS Preload预加载列表申请指南

从HTTP到HTTPS的强制跳转配置到HSTS Preload列表申请,本文提供完整、可落地的技术步骤,涵盖Nginx、Apache、CDN场景,并详解Chromium HSTS Preload提交条件与常见驳回原因。

全站HTTPS强制跳转与HSTS Preload预加载列表申请指南
封面图:ZuCDN · ZuCDN 原创

为什么需要全站HTTPS与HSTS Preload

当网站迁移到HTTPS后,很多用户仍可能通过HTTP协议访问旧链接,或者中间人劫持将请求降级为HTTP。单纯配置301跳转并不够——首次HTTP请求依然存在被篡改的风险。HSTS(HTTP Strict Transport Security)告诉浏览器:本域名及其子域名必须使用HTTPS,任何明文连接都直接拒绝。而HSTS Preload则更进一步,将域名硬编码到浏览器内置的强制HTTPS列表中,即使用户从未访问过该网站,浏览器也会自动使用HTTPS。

本指南覆盖从零配置HTTPS跳转到成功加入Preload列表的全流程,并针对常见驳回原因提供排查思路。不编造“客户案例”,只给可执行的命令与参数。

第一步:部署全站HTTPS强制跳转

1.1 在Nginx中实现HTTP→HTTPS 301跳转

编辑站点配置文件(通常位于 /etc/nginx/sites-available/),在server块中监听80端口并设置永久重定向:

server {
    listen 80;
    server_name example.com www.example.com;
    return 301 https://$host$request_uri;
}

注意:如果使用CNAME或泛域名,确保$host变量能正确捕获请求域名,避免跳转到错误域名。检查语法:nginx -t,再重载:systemctl reload nginx

1.2 在Apache中实现HTTP→HTTPS跳转

使用.htaccess或VirtualHost配置。推荐在VirtualHost的中添加:

RewriteEngine On
RewriteCond %{HTTPS} off
RewriteRule ^(.*)$ https://%{HTTP_HOST}/$1 [R=301,L]

如果用.htaccess,确保站点目录启用了AllowOverride All。注意:不要在HTTPS的VirtualHost里误写跳转循环。

1.3 在CDN/反向代理环境下的特殊处理

如果用了Cloudflare、Fastly、阿里云CDN等,通常CDN本身提供强制HTTPS开关。但底层源站仍需监听HTTP并做跳转?**不需要**——CDN会丢弃或改写请求。但为了保险,建议源站同时配置跳转,且设置只信任CDN回源IP(通过real_ip_header避免伪造)。例如Cloudflare用户可在仪表盘“SSL/TLS”->“Edge Certificates”启用“Always Use HTTPS”。

第二步:配置HSTS响应头

强制跳转让用户从HTTP进入HTTPS,但第一次HTTP请求仍然暴露。HSTS头可以告诉浏览器:在接下来一段时间内,该域名只接受HTTPS。配置方式:

2.1 选择合理的max-ageincludeSubDomains

严格按Preload列表要求:max-age至少31536000秒(1年),必须加上includeSubDomains,并且配合preload标记。示例:

Strict-Transport-Security: max-age=31536000; includeSubDomains; preload

若网站有非安全的子域(如http://admin.example.com),开启includeSubDomains会导致这些子域无法通过HTTP访问。必须在配置前确认所有子域都已支持HTTPS。

2.2 Nginx下添加HSTS头

在HTTPS server块中(通常监听443)添加:

add_header Strict-Transport-Security "max-age=31536000; includeSubDomains; preload" always;

关键字always确保即使遇到错误码(如404)也发送此头。

2.3 Apache下添加HSTS头

使用Header指令。在内或.htaccess(仅当允许mod_headers):

Header always set Strict-Transport-Security "max-age=31536000; includeSubDomains; preload"

第三步:验证HSTS配置是否生效

3.1 在线测试工具

使用hstspreload.org自带的检测:输入域名,点击“Check HSTS Preload status and eligibility”。它会详细列出当前响应头、是否匹配Preload条件。

3.2 使用Curl手动检查

curl -sI https://example.com | grep -i strict-transport

返回类似:strict-transport-security: max-age=31536000; includeSubDomains; preload。如果缺少preload标记,则需要回看配置。

3.3 确认子域也生效

测试一个子域如www.example.comapi.example.com,确保返回相同的HSTS头。如果某个子域没有HTTPS证书或返回不同头,必须关闭includeSubDomains或先修复子域。

第四步:申请加入HSTS Preload列表

4.1 提交前必须满足的条件

  • 网站已全面启用HTTPS,强制跳转配置正确。
  • HSTS头中包含preload标记。
  • max-age ≥ 31536000(1年),且已包含includeSubDomains
  • 顶级域名(如example.com)在收到HSTS头后,所有子域也必须能用HTTPS访问(不要求所有子域都配置HSTS头,但必须可HTTPS访问)。
  • 证书链完整,无过期证书。
  • 所有重定向(包括子域)最终指向HTTPS。

4.2 在hstspreload.org提交

访问 https://hstspreload.org/,在输入框填写顶级域名(不带www),点击“Submit”。系统会进行自动化验证,通常几秒内返回“Your domain is eligible for preloading”或列出失败原因。

如果通过,页面会显示“Submit to the preload list”按钮,点击后填写邮箱(用于接收状态变更通知)。确认提交后,你的域名会被加入Chromium的Preload列表候选,随后在其后的浏览器版本(Chrome等)中生效。

4.3 常见驳回原因与解决办法

  • “HSTS header is not sent on the preload URL”:测试的URL通常为裸域(example.com)的HTTPS版本,确保该域名直接在443端口返回HSTS头,而非重定向到其他域名。
  • “Redirects to another domain without HSTS”:检查从HTTP到HTTPS的跳转过程中是否经过非HTTPS中间域,或跳转到的目标域名没有HSTS头。最佳实践:裸域直接HTTPS,不跳转www或其他域名。
  • “max-age too short”:必须为31536000秒,检查是否拼写错误或漏掉单位。
  • “Missing includeSubDomains”:必须明确包含includeSubDomains,注意Apache和Nginx配置中拼写是否正确。

第五步:提交后的注意事项

5.1 冷静期与生效时间

提交后,你的域名会进入“pending”状态。Chromium通常会在下一个主版本更新时(约6-8周)将列表合并。在此期间不要撤销HSTS头或关闭子域HTTPS,否则可能被移出候选。

5.2 风险:无法撤销的后果

一旦域名进入Preload列表,任何用户浏览器(Chrome、Edge、Firefox、Opera等)都会强制HTTPS,且无法通过客户端设置绕过。如果你的网站后来需要关闭HTTPS(例如迁移到非HTTPS环境或子域使用自定义非安全服务),必须等待至少一年才能从列表中移除(通过申请删除,需社区审核)。移除过程同样漫长。因此,仅在确定长期全站HTTPS时提交。

5.3 监控与回滚方案

提交前,建议在非生产环境模拟测试。可以用一个不重要的子域(如hststest.example.com)先提交到Preload列表测试流程。确认无误后再为主域名提交。注意:子域提交不会影响主域。

如果配置错误导致网站无法访问,紧急措施:关闭CDN上的HSTS头,或者从服务器移除preload标记(但浏览器已缓存的用户仍会被强制HTTPS)。真正的解决方案是尽快修复证书或HTTPS配置。

总结

全站HTTPS强制跳转是基本动作,HSTS头加固了安全性,而HSTS Preload则从浏览器源头杜绝了降级攻击。配置流程:

  • 实施HTTP→HTTPS的301跳转(Nginx/Apache/CDN)。
  • 在HTTPS响应中添加Strict-Transport-Security头,满足Preload条件。
  • 使用hstspreload.org验证并提交。
  • 长期维护:保证所有子域HTTPS可用,证书不失效。

此过程不需要昂贵工具或特殊权限,只要你能控制DNS和服务器配置即可。一旦完成,你的用户将获得浏览器原生的强制HTTPS保障,大幅降低中间人攻击面。

延伸阅读