移动端hsts预加载是否生效,需通过hstspreload.org确认域名是否已预载,并在未访问过的设备上测试http跳转https行为;ios safari完全依赖预载列表,服务端301跳转与https响应头strict-transport-security缺一不可。

移动端浏览器对 HSTS 预加载的支持无法直接通过设备界面“查看是否启用”,但可通过组合方式验证其实际生效效果——重点不是“它支不支持预加载”,而是“你的域名是否已被该浏览器实际加载并强制 HTTPS”。以下是可落地的测试方法:
确认域名是否已进入主流浏览器预加载列表
这是最权威的前置判断:
- 访问 https://hstspreload.org,输入你的域名(如 example.com),点击 Check Submission
- 若显示 “This domain is currently preloaded” 或 “Status: OK”,说明 Chrome、Edge、Firefox、Safari(iOS/macOS)等均已内置该策略,首次访问即强制 HTTPS,无需任何缓存或历史记录
- 若显示 “Not preloaded” 或 “Pending review”,则移动端首次访问仍可能走 HTTP(除非用户此前在该设备上用 HTTPS 访问过并触发了普通 HSTS 缓存)
在真实移动设备上模拟“首次访问”场景
预加载的意义在于覆盖“零接触”用户,因此需排除本地 HSTS 缓存干扰:
- 使用一台**未访问过你网站的 iOS 或 Android 设备**(或重置 Safari/Chrome 的网站数据)
- 在地址栏输入 http://yourdomain.com(注意是 http://,非 https://)
- 观察行为:若地址栏瞬间跳转为 https:// 且页面正常加载,说明预加载已生效;若出现连接失败、证书警告或卡在 HTTP,则预加载未生效或配置有误
- 特别注意 iOS Safari:它完全依赖 hstspreload.org 列表,不接受 max-age 缓存的 HSTS 策略用于首次访问,所以仅靠 Nginx 的 add_header 无法实现“首次即安全”
抓包验证响应头与重定向链路
借助移动端调试工具确认底层行为:
- 在 Android 上启用 Chrome 的 chrome://inspect,连接设备后远程调试网页网络请求
- 在 iOS 上启用 Web Inspector(设置 → Safari → 高级 → Web Inspector),配合 macOS Safari 的开发菜单抓包
- 检查 HTTPS 响应头中是否包含:
Strict-Transport-Security: max-age=31536000; includeSubDomains; preload - 同时确认 HTTP 请求(80端口)是否返回 301 跳转到 HTTPS —— 预加载虽强,但完整闭环仍需服务端跳转兜底
辅助验证:命令行 + 移动网络环境
绕过设备 UI,从协议层确认策略传递:
- 在手机终端(如 Termux)或电脑上执行:
curl -I http://yourdomain.com→ 应返回 301 Location: https://... - 再执行:
curl -I https://yourdomain.com→ 响应头中必须含 Strict-Transport-Security,且无拼写错误、无空格缺失 - 关键点:preload 参数本身不会出现在响应头中被“识别”,它只是向浏览器发出加入预加载列表的声明;真正起效的是浏览器是否已在本地内置该域名











