Angular应用如何阻止HTTP请求被自动重定向至HTTPS
问题原因
你配置的<meta http-equiv="Content-Security-Policy" content="upgrade-insecure-requests">本身作用就是强制将页面下所有HTTP请求自动升级为HTTPS,属于完全配反了方向,没生效只是因为你标签写法漏了content属性的闭合引号,就算写对了也只会加重请求被升级的问题。
HTTPS站点下发起的HTTP请求被自动改协议,通常是多层规则共同作用的结果,按以下步骤排查解决即可:
排查解决步骤
- 第一步:删除错误配置
直接删掉index.html里加的上述CSP meta标签,同时检查你部署Angular应用的Web服务器(Nginx/Apache)、CDN、WAF的响应头配置,删掉返回头里Content-Security-Policy字段携带的upgrade-insecure-requests规则。 - 第二步:清理浏览器侧强制HTTPS规则
主流浏览器默认开启HTTPS优先模式,同时会缓存站点的HSTS策略强制跳HTTPS:- 进入对应站点的浏览器权限设置,关闭「始终使用安全连接」选项
- Chrome/Edge可访问
chrome://net-internals/#hsts,在Delete domain security policies模块输入你的Angular应用域名,清除本地HSTS缓存
注意:如果你的域名在浏览器内置的HSTS预加载列表中,这步操作无效,无法绕过浏览器侧的强制升级
- 第三步:排查中间代理层升级规则
检查Angular应用前置的反向代理、CDN、网关配置,关闭「HTTP请求自动升级HTTPS」「强制HTTPS跳转」类的开关,排除中间层改写请求协议的情况。 - 第四步:校验Angular项目配置
- 检查生产环境配置文件
environment.prod.ts里的API地址前缀,必须写明确的http://开头的绝对路径,不要用相对路径,也不要用//xxx这类省略协议的相对协议地址(这类地址会自动继承当前页面的HTTPS协议) - 全局搜索项目代码,检查自定义Http拦截器里有没有写自动替换请求协议为HTTPS的逻辑。
- 检查生产环境配置文件
- 第五步:(推荐永久方案)给后端HTTP服务配置HTTPS
所有现代浏览器都对混合内容有严格限制:HTTPS站点下发起的HTTP接口请求属于活动混合内容,就算你绕开了所有自动升级规则,浏览器也会直接拦截请求,控制台抛出Mixed Content错误,这个是浏览器安全基线的硬限制,不可能要求所有访问用户手动修改浏览器安全设置来绕过。给目标后端服务配置免费SSL证书走HTTPS协议,是唯一无兼容问题的解决方式。
内容的提问来源于stack exchange,提问作者Marco
相关产品推荐
相关产品推荐

