upgrade-insecure-requests仅在https页面中生效,强制将http资源请求升级为https且不回退,若目标https不可用则直接失败;它不触发协议跳转,也不保障第三方资源兼容性。

它不会帮你把 HTTP 页面跳转成 HTTPS,也不会让不支持 HTTPS 的资源“自动变安全”——加了就出 404 或扣费,才是常态。
upgrade-insecure-requests 在 HTTP 页面里完全不生效
你本地用 http://localhost:3000 打开页面,哪怕写了 <meta http-equiv="Content-Security-Policy" content="upgrade-insecure-requests">,浏览器也直接忽略。这个指令只在已通过 HTTPS 加载的页面中触发,作用是改写后续资源请求(比如 <img src="http://example.com/a.jpg?x-oss-process=image/resize,p_40"> → 实际发 https://example.com/a.jpg)。它不管用户怎么输入地址,也不管服务器有没有配 SSL。
- 首次访问
http://链接时,HTML 还没开始解析,<meta>根本没机会执行 - 真正该做协议跳转的地方是 Nginx、CDN 或负载均衡器,比如加
return 301 https://$host$request_uri; - 如果你靠这个 meta 标签“假装”完成了 HTTPS 迁移,上线后所有资源都会 404
升级后请求失败,浏览器绝不回退到 HTTP
一旦启用 upgrade-insecure-requests,所有匹配的 http:// 请求都会被强制改成 https://,然后直接发出。如果目标 HTTPS 不可达(证书错误、端口未开、CDN 未启用 TLS),结果就是 404、连接拒绝或证书警告 —— 浏览器不会尝试降级重试。
-
<img src="http://cdn.example.com/logo.png?x-oss-process=image/resize,p_40">升级为https://cdn.example.com/logo.png→ CDN 没配 HTTPS → 图片空白 -
fetch("http://api.old-service.com/data")→ 变成https://api.old-service.com/data→ 服务不响应 HTTPS → Promise reject - LeanCloud、又拍云等对象存储若只开通 HTTP 访问,升级后会产生额外 HTTPS 出口流量,免费额度快速耗尽
哪些请求会被升级?哪些不会?
它只改写「非导航类」的主动资源请求,且仅限于能被浏览器解析并重写的 URL。很多你以为会被升级的地址,其实根本不在作用范围内。
- 会被升级:
<img src="http://site.com/a.jpg?x-oss-process=image/resize,p_40">、<script src="http://site.com/app.js"></script>、相对路径<link href="/css/main.css">(自动补成 HTTPS) - 不会升级:
<img src="http://third-party.com/b.png?x-oss-process=image/resize,p_40">(跨域绝对 URL,部分浏览器不升级)、<link rel="preload" href="http://site.com/font.woff">(预加载在 CSP 解析前就发出了)、表单<form action="http://..."></form>(导航类请求) - 更隐蔽的:WebSocket 地址
ws://不会被升级为wss://,需手动改写
用响应头比用 标签更可靠
Content-Security-Policy: upgrade-insecure-requests 响应头由服务器在返回 HTML 前就发送,优先级高于 <meta>,且对所有子资源(包括 iframe 内嵌页)生效;而 <meta> 只在当前 HTML 解析时起作用,还受页面编码、位置(必须在 前部)影响。
- Apache 配置:
Header set Content-Security-Policy "upgrade-insecure-requests" - Nginx 配置:
add_header Content-Security-Policy "upgrade-insecure-requests"; - 注意不要和
block-all-mixed-content同时设置,后者会被前者覆盖,形同虚设
真正麻烦的不是加不加这个指令,而是你是否清楚每个 http:// 资源背后的服务是否 ready for HTTPS —— 它不检查、不验证、不兜底,只执行。线上出问题时,第一反应不该是“为什么没升级”,而是“这个 HTTPS 地址到底能不能通”。
前端入门到VUE实战笔记:立即使用
在学习笔记中,你将探索 前端 的入门与实战技巧!











