该问题本质是移动端浏览器hsts策略导致ip直连被拦截:因曾用https访问过启用hsts的域名,浏览器将ip“关联记忆”并拒绝http/https访问。验证需查chrome://net-internals/#hsts中对应域名是否found;绕过方法包括无痕模式、非hsts子域+自签名证书、http非标端口,或清除hsts库。

这个问题本质不是“离线缓存”,而是移动端浏览器(Chrome、Edge、Safari)已将域名记入HSTS策略库,导致你用 http://IP地址 或 https://IP地址 访问时被主动拦截——哪怕没走域名解析,只要端口和路径匹配、且该IP曾对应过已启用HSTS的域名,部分浏览器(尤其Android Chrome)会沿用历史策略,拒绝建立连接。
确认是否真被HSTS策略影响
别猜,直接查本地记录:
- 在手机 Chrome 地址栏输入
chrome://net-internals/#hsts(需开启桌面版站点或使用电脑调试工具远程连接) - 在 “Query domain” 输入你曾经用过的**正式域名**(如
app.example.com),不是 IP;若返回Found,说明策略已生效并可能泛化影响同IP的其他访问方式 - 若无法访问 chrome:// 页面,可用电脑通过 ADB 调试:执行
adb shell am start -a android.intent.action.VIEW -d "chrome://net-internals/#hsts"
为什么 IP 直连也会被拦?
HSTS 不校验 Host 头或 SNI,只绑定域名。但移动端浏览器存在两个隐性行为:
-
策略继承倾向:当某 IP 曾响应过带 HSTS 头的域名(如 HTTPS 响应中含
Strict-Transport-Security: max-age=31536000; includeSubDomains),部分 Android Chrome 版本会将该 IP 地址“关联记忆”,后续对同一 IP 的 HTTP 请求直接拦截(即使 URL 是http://192.168.1.100) -
证书主机名不匹配触发降级阻断:用 HTTPS + IP 访问时,若证书是为
app.example.com签发的,浏览器校验证书失败 → 触发 HSTS 安全回退机制 → 拒绝降级到 HTTP,也不允许忽略警告继续访问
绕过限制进行 IP 直连调试的实操方法
目标:让调试请求完全脱离 HSTS 策略上下文
- 换无痕/隐私模式打开:移动端 Chrome 的无痕窗口不继承 HSTS 缓存,是最快速验证方式;注意关闭所有常规标签页后再开无痕
-
临时改用未注册子域 + 自签名证书:比如新增
debug-app.example.com,Nginx 单独配一个 server 块,禁用 HSTS(删掉add_header Strict-Transport-Security),并用 mkcert 生成该子域证书;这样既走 HTTPS 又无 HSTS 约束 -
改用 HTTP + 非标准端口(仅限内网调试):在 Nginx 中为调试用途单独开一个
listen 8080;的 server 块,不启用 SSL,也不返回任何 HSTS 头;用http://192.168.1.100:8080访问 —— 因域名从未注册过 HSTS,浏览器不会干预 -
清除整个 HSTS 策略库(高级):Android 上可通过 Chrome 设置 → 隐私权与安全性 → 清除浏览数据 → 勾选“Cookie 及网站数据”+“缓存的图片和文件”,但注意这会登出所有网站;更精准的是用 adb 执行:
adb shell pm clear com.android.chrome(会清空全部 Chrome 数据)
长期避免此类问题的配置建议
调试环境与生产环境必须隔离策略:
- Nginx 中用
map指令动态控制 HSTS:例如根据 $host 是否包含-dev或192.168.等特征,设$hsts_value为空字符串,再写add_header Strict-Transport-Security $hsts_value always; - 调试用的测试域名(如
local.example.com)坚决不提交到 hstspreload.org,也不在生产 Ingress 中开启hsts: true注解 - 移动端自动化脚本(如 App 内 WebView 或 Flutter 的 webview_flutter)若需直连 IP,应在初始化时禁用 HSTS 检查(Android WebView 可通过
WebSettings.setMixedContentMode配合后端豁免逻辑实现)











