跳到主要内容
极客日志极客日志面向AI+效率的开发者社区
首页博客GitHub 精选镜像工具UI配色美学隐私政策关于联系
搜索内容 / 工具 / 仓库 / 镜像...⌘K搜索
注册
博客列表
HTML / CSS大前端

前端图片裂图原因全解析:混合内容与防盗链排查

前端开发中图片裂图常由路径错误、防盗链或混合内容引起。重点解析 HTTPS 页面加载 HTTP 资源时的浏览器行为,包括主动与被动混合内容的区别及自动升级机制。通过 Network 面板状态码、Console 警告及 CSP 策略检查,可快速定位问题根源并给出相应修复方案。

霸天发布于 2026/4/7更新于 2026/5/2314 浏览

在前端开发中,我们几乎都遇到过这种情况:页面里某张图片加载不出来,显示成一个小小的'裂图'图标。

这看似简单的问题,实际上可能由多种原因造成,尤其是在 HTTPS 环境下,混合内容机制(Mixed Content) 是最常见、也最容易被误解的根源之一。

本文将带你系统梳理裂图的各种原因、排查思路,并重点讲清楚混合内容的原理与浏览器行为。

一、什么是'裂图'?

'裂图'(broken image)是指浏览器尝试加载 <img> 标签的图片资源失败时的表现形式。常见表现包括:

  • 图片区域显示为灰底、叉号或占位符;
  • 控制台出现 Failed to load resource 或 Mixed Content 警告;
  • Network 面板中图片请求状态码为 404 / 403 / blocked。

二、常见的裂图原因汇总

2.1 图片资源不存在

最基础的情况。可能是路径错误(相对/绝对路径混乱)、资源被删除或未上传、OSS/CDN 缓存未刷新,或者是拼接 URL 时丢失了参数(如签名 URL 过期)。

排查建议:

  • 打开 Network 面板查看请求详情;
  • 直接在浏览器地址栏访问图片 URL;
  • 确认返回码是否为 404 或 403。

2.2 图片服务器防盗链(Referer 校验)

很多图片或 CDN 都会校验 Referer,限制图片只能在指定域名下访问。如果请求来源不在白名单内,服务器会拒绝访问(403)。

典型症状:

  • Network 状态码 403;
  • 响应头中带有自定义防盗链提示。

解决办法:

  • 通过后端代理请求;
  • 或联系服务端将当前域加入 Referer 白名单。

2.3 响应头设置错误

  • 如果返回头不是图片类型(例如 text/html),浏览器可能无法渲染;
  • 如果设置了 Content-Disposition: attachment,浏览器可能会触发下载行为,但现代浏览器对图片通常会放行显示。

2.4 权限与签名失效

某些云存储(如 OSS / COS / S3)要求签名 URL 才能访问。签名过期后图片加载失败。

2.5 CSP 限制(Content-Security-Policy)

如果页面设置了严格的 CSP 策略,例如:

Content-Security-Policy: img-src https://static.example.com 

那么任何不在允许列表内的图片都会被阻止。

三、混合内容机制(Mixed Content)

这是前端 HTTPS 场景下导致'裂图'的核心原因之一。

这种情况一般控制台会报错:net::ERR_CERT_COMMON_NAME_INVALID

3.1 混合内容是什么?

一个通过 HTTPS 加载的页面,去请求非 HTTPS(HTTP)的资源。

<!-- 页面本身是 https://example.com -->
<img src="http://img.example.com/a.png">

此时页面是安全的,但图片请求是不安全的,浏览器会认定为'混合内容'。

3.2 为什么要阻止混合内容?

因为 HTTP 请求容易被中间人攻击。攻击者可以篡改图片、注入恶意脚本、或监听请求,从而破坏整个 HTTPS 页面的安全性。

3.3 混合内容的两种类型

类型说明浏览器行为
主动混合内容(Active Mixed Content)能影响页面逻辑的内容,例如 <script>、<iframe>、XHR、CSS、WebSocket🚫 直接阻止
被动混合内容(Passive Mixed Content)不影响逻辑的内容,例如图片、音视频、CSS 背景图⚙️ 可能被升级或阻止

3.4 可升级内容(Upgradable Content)

从 Chrome 80+ / Edge 79+ / Firefox 83+ 起,浏览器对某些被动混合内容启用了 '自动升级机制'。当页面是 HTTPS 时,如果 <img> 的地址是 HTTP,浏览器会尝试自动改为 HTTPS 重新加载。

3.4.1 举例说明:
<!-- 页面是 https://page.com -->
<img src="http://cdn.page.com/pic.png" />

浏览器会自动尝试请求:

https://cdn.page.com/pic.png 

如果资源服务器支持 HTTPS,就会成功显示。如果不支持或证书无效,加载失败(显示裂图)。

注意浏览器在 network 面板请求的是 https 请求,但是 DOM 中还是显示的 http 地址,浏览器可不会自动修改你的 DOM。

那么问题来了,为啥 DOM 没变但是渲染的是 https?

因为请求完成后,浏览器渲染的是'响应的二进制内容',不是 URL。

图片 <img> 加载流程其实是:DOM 给出 URL 字符串(http)→ Resource Loader 把它升级成 https 并发送请求 → 请求返回后产生一个 decoded image bitmap(解码好的位图)→ <img> 标签拿到的是'图片数据对象'(Image Bitmap / Image Document)→ 把这个 bitmap 交给渲染引擎绘制在页面上。

也就是说,渲染用的不是 URL,而是'图片数据'。

3.4.2 浏览器不会把 <img> 改成 https

因为 URL 升级只是加载规则(fetching rule)的结果,不是文档结构 (DOM) 的改变。

浏览器的设计理念:

  • DOM = 你的代码
  • Loaders = 浏览器的行为

浏览器永远不会篡改你的 DOM 代码,只在加载阶段更换 URL。

3.5 哪些资源属于'可升级内容'

元素类型是否会自动升级
<img>✅ 是
<audio> / <video> / <source>✅ 是
CSS 图片(background-image, border-image)✅ 是
<script> / <iframe> / XHR❌ 否,直接阻止

📘 官方文档参考:MDN: 混合内容(Mixed Content)

3.6 注意:不是'所有场景'都自动升级

  • 升级依赖浏览器支持;
  • 如果资源使用了 IP、非标准端口或证书无效,不会升级;
  • 如果页面设置了 CSP:
    • 则会强制所有 HTTP 请求都升级为 HTTPS
    • 升级失败依然会导致裂图。
Content-Security-Policy: upgrade-insecure-requests 

3.7 为什么以前的说法是'不会自动改为 https'

因为在 Chrome 80 之前(2020 年以前),浏览器并不具备'自动升级'行为,只是警告或阻止。现在的混合内容机制是新一代浏览器安全策略的演进结果。

3.8 HTTP 页面加载 HTTPS 图片会怎样?

不会触发混合内容,HTTP 页面加载 HTTPS 图片完全合法,只是页面本身不安全。

四、其他容易忽略的裂图原因

4.1 跨域限制(Canvas 绘制)

若 <img> 跨域加载资源后再画到 <canvas> 上,未设置 crossorigin 会触发安全限制。

4.2 图片过大或加载超时

大图未能在超时时间内返回,可能表现为裂图。

4.3 服务端缓存头异常

过期或 ETag 不匹配,导致 CDN 无法正确命中图片。

五、排查与修复建议

步骤操作检查内容
1Network 面板查看状态码 / 请求协议(HTTP or HTTPS)
2Console 控制台搜索 Mixed Content 或 Failed to load resource
3直接访问 URL检查是否可用、证书是否有效
4检查 CSP是否限制了 img-src 来源
5检查响应头Content-Type、Referer、防盗链策略等

六、总结

混合内容机制是现代浏览器为保证 HTTPS 安全性而做出的妥协与平衡。对于前端开发者而言,理解它的升级与阻止逻辑,是解决'裂图'的关键。

类别原因浏览器行为解决方案
资源不存在404裂图修正路径
防盗链403裂图调整 Referer 或代理
HTTP → HTTPS 混合内容被动混合内容自动升级或阻止改为 HTTPS
CSP 限制阻止加载裂图修改策略
Content-Type 错误无法解析裂图服务端修正
签名 URL 失效403裂图重新生成签名

目录

  1. 一、什么是“裂图”?
  2. 二、常见的裂图原因汇总
  3. 2.1 图片资源不存在
  4. 2.2 图片服务器防盗链(Referer 校验)
  5. 2.3 响应头设置错误
  6. 2.4 权限与签名失效
  7. 2.5 CSP 限制(Content-Security-Policy)
  8. 三、混合内容机制(Mixed Content)
  9. 3.1 混合内容是什么?
  10. 3.2 为什么要阻止混合内容?
  11. 3.3 混合内容的两种类型
  12. 3.4 可升级内容(Upgradable Content)
  13. 3.4.1 举例说明:
  14. 3.4.2 浏览器不会把 <img> 改成 https
  15. 3.5 哪些资源属于“可升级内容”
  16. 3.6 注意:不是“所有场景”都自动升级
  17. 3.7 为什么以前的说法是“不会自动改为 https”
  18. 3.8 HTTP 页面加载 HTTPS 图片会怎样?
  19. 四、其他容易忽略的裂图原因
  20. 4.1 跨域限制(Canvas 绘制)
  21. 4.2 图片过大或加载超时
  22. 4.3 服务端缓存头异常
  23. 五、排查与修复建议
  24. 六、总结
  • 💰 8折买阿里云服务器限时8折了解详情
  • Magick API 一键接入全球大模型注册送1000万token查看
  • 🤖 一键搭建Deepseek满血版了解详情
  • 一键打造专属AI 智能体了解详情
极客日志微信公众号二维码

微信扫一扫,关注极客日志

微信公众号「极客日志V2」,在微信中扫描左侧二维码关注。展示文案:极客日志V2 zeeklog

更多推荐文章

查看全部
  • 动态规划在斐波那契数列中的应用与优化
  • MySQL 表的内连接与外连接
  • 智能家居中的 DHT11:低成本环境监测方案设计与优化
  • VS Code 配置 C/C++ 编程运行环境
  • 66 个可直接访问的机器人项目合集!涵盖科研 / 教育 / 工业 / 医疗(附详细介绍与项目代码链接)
  • Claude Code 安装配置与实战指南
  • GitHub 汉化插件安装与配置指南
  • 3 分钟学会给 Cursor 配置代理
  • 3ds Max VR 渲染器局部渲染设置教程
  • libwebkit2gtk-4.1-0 安装依赖处理:Ubuntu 22.04 场景解析
  • 数据结构与算法实战:查找算法核心原理与代码实现
  • LLaMA-Factory 命令行工具常用操作指南
  • Linux 进程概念详解:冯诺依曼体系与操作系统
  • GTC2026 前瞻:Rubin 平台与 AI 工厂体系
  • SpringBoot 结合 RabbitMQ 实现应用间通信详解
  • 如何利用 AI 大模型解决实际问题:从实操案例到通用方法论
  • 集团企业数字化:低代码如何实现多系统统一管理?
  • GitHub 国内镜像站推荐及 Git Clone 加速配置
  • Linux 最小系统核心组件与构建详解
  • Skills 智能体驱动开发:从使用到项目实战详解

相关免费在线工具

  • Base64 字符串编码/解码

    将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online

  • Base64 文件转换器

    将字符串、文件或图像转换为其 Base64 表示形式。 在线工具,Base64 文件转换器在线工具,online

  • Markdown转HTML

    将 Markdown(GFM)转为 HTML 片段,浏览器内 marked 解析;与 HTML转Markdown 互为补充。 在线工具,Markdown转HTML在线工具,online

  • HTML转Markdown

    将 HTML 片段转为 GitHub Flavored Markdown,支持标题、列表、链接、代码块与表格等;浏览器内处理,可链接预填。 在线工具,HTML转Markdown在线工具,online

  • JSON 压缩

    通过删除不必要的空白来缩小和压缩JSON。 在线工具,JSON 压缩在线工具,online

  • JSON美化和格式化

    将JSON字符串修饰为友好的可读格式。 在线工具,JSON美化和格式化在线工具,online