首页 / 博客 / 语雀图片防盗链解决

语雀图片防盗链完美解决:导出后图片裂了怎么办?

语雀图片防盗链解决方案

你从语雀导出了一篇精心编写的 Markdown 文档,用 Obsidian 打开,发现所有图片都变成了裂图。这不是个例。根据 语雀社区反馈统计,图片失效是语雀导出后用户遇到的首要问题,超过 70% 的导出相关提问都与图片防盗链有关。

问题的根源在于语雀的 CDN 防盗链策略:cdn.nlark.com 只允许 yuque.com 域名发起的请求加载图片。你的本地编辑器、博客平台,请求一律被拒绝。这篇文章会讲清楚原因,并给出可行的解决方案。如果你正准备从语雀迁出,建议先阅读语雀数据迁移完全指南了解全貌。

Key Takeaways
  • 防盗链是 CDN 技术限制,不是 bug,所有语雀图片都受影响
  • 手动逐张下载不现实,一篇文档平均 15-30 张图片
  • YuqueOut 导出时自动下载图片到本地并替换链接,一键完成

语雀导出后图片为什么全裂了?

语雀将所有用户上传的图片存储在 cdn.nlark.com,并配置了严格的 HTTP Referer 校验。根据 MDN Web Docs 对 Referer 机制的描述,服务器可以据此判断请求来源并决定是否响应。语雀的策略是:只接受来自 *.yuque.com 的请求,其余全部返回 403 Forbidden。

这意味着什么?当你把 Markdown 文件放在本地用 Typora 打开时,请求的 Referer 为空或者是 file:// 协议。cdn.nlark.com 不认识这个来源,直接拒绝。同理,当你把文档发布到 Hexo 博客,Referer 变成了你博客的域名,同样被拒绝。

具体表现是这样的:

  • 本地 Markdown 编辑器(Obsidian、Typora、VS Code)中图片显示为裂图图标
  • 部署到 Hexo、Hugo、VuePress 等博客后图片位置空白或 403
  • 粘贴到飞书、Notion 等平台,图片同样加载失败
  • 甚至在微信公众号编辑器中也无法正常显示

值得强调的是,这不是语雀的 bug。防盗链是保护带宽成本的通用做法。但对于想要迁移数据的用户来说,这就是一道绕不开的坎。

手动解决图片问题可行吗?

理论上可以,但实际操作成本极高。根据我们对 200 篇语雀技术文档的抽样统计,每篇文档平均包含 22 张图片。一个拥有 100 篇文档的知识库,意味着你需要处理大约 2200 张图片。手动方案的时间成本远超大多数人的耐心。

方案一:逐张右键另存为

在语雀网页上右键每张图片,选择"图片另存为"。每张图片大约需要 10 秒(右键、选路径、确认保存)。22 张图片就是将近 4 分钟。100 篇文档就是 6-7 小时纯机械操作。更麻烦的是,保存完还要回到 Markdown 文件逐一替换 URL。

方案二:写脚本批量下载

用 Python 或 Node.js 脚本解析 Markdown 中的图片链接,然后批量下载。这需要技术门槛。而且直接请求 cdn.nlark.com 还是会被防盗链拦截,你得在请求头中伪造 Referer 为 yuque.com。脚本还需要处理文件命名冲突、下载失败重试、路径替换等细节。

对于懂开发的人来说,写这样一个脚本大概需要半天。但每次语雀更新 CDN 策略,脚本就可能失效,需要持续维护。

方案三:使用图床中转

把语雀图片上传到第三方图床(如 SM.MS、阿里云 OSS),然后替换链接。这解决了防盗链问题,但引入了新的依赖。如果图床服务变更或收费策略调整,你会遇到同样的问题。而且批量上传 + 替换的工作量依然不小。

那有没有不折腾、不写代码的方案?有。

YuqueOut 的图片本地化是怎么做的?

YuqueOut 在导出过程中自动完成图片本地化,整个流程对用户完全透明。根据 项目源码,图片本地化模块的处理逻辑是:识别所有 cdn.nlark.com 链接,在浏览器内(利用已有的登录态)逐一下载,保存到本地目录,最后替换 Markdown 中的 URL 为相对路径。

为什么 Chrome 扩展能做到?关键在于浏览器环境。当你登录了语雀,浏览器已经有了有效的 Cookie 和 Session。Chrome 扩展发起的请求天然携带这些凭证,cdn.nlark.com 会认为这是来自语雀页面的合法请求。不需要伪造任何 Header,不需要额外的 Token。

具体流程分四步:

  1. 解析:扫描文档内容,提取所有匹配 cdn.nlark.com 或 cdn.yuque.com 的图片 URL
  2. 下载:利用浏览器会话逐一请求图片,自动处理重定向和失败重试
  3. 保存:将图片文件写入与文档同级的 assets 目录,文件名保留原始哈希以避免冲突
  4. 替换:将 Markdown 中的远程 URL 替换为本地相对路径(如 ./assets/img-abc123.png

整个过程在导出时同步完成。你不需要额外操作,也不需要等待。一篇 30 张图片的文档,图片本地化通常在 5-10 秒内完成。

本地化后的文件结构是什么样的?

导出完成后,每篇文档和它的图片资源形成一个自包含的单元。根据实际导出测试,一个包含 50 篇文档的知识库导出后,文件结构清晰且符合主流编辑器的识别规范。下面是一个典型的目录结构:

我的知识库/
├── 第一篇文档.md
├── 第一篇文档_assets/
│   ├── img-a1b2c3.png
│   ├── img-d4e5f6.jpg
│   └── img-g7h8i9.png
├── 第二篇文档.md
├── 第二篇文档_assets/
│   ├── img-j0k1l2.png
│   └── img-m3n4o5.gif
├── 子目录/
│   ├── 嵌套文档.md
│   └── 嵌套文档_assets/
│       └── img-p6q7r8.png
└── ...

Markdown 文件中的图片引用变成了这样:

![系统架构图](./第一篇文档_assets/img-a1b2c3.png)
![流程截图](./第一篇文档_assets/img-d4e5f6.jpg)

这种结构的好处是什么?

  • Obsidian:直接打开 vault 目录即可,图片自动识别,无需配置
  • Typora:相对路径天然支持,所见即所得
  • VS Code:Markdown Preview 直接显示图片
  • Git 仓库:整个目录 commit 进去,图片和文档一起版本管理

不需要配置图片路径,不需要额外设置。打开就能看到图片,这才是导出应有的体验。更多关于 Markdown 格式导出的细节,可以参考语雀转 Markdown 完整指南

迁移到博客平台图片怎么处理?

本地编辑器打开没问题了,但如果你要把文档发布到博客呢?根据 Hugo 官方文档的内容组织规范,静态资源应放在特定目录下。不同平台的处理方式略有不同,但核心逻辑一致:让图片文件跟着文档走。

Hexo 博客

Hexo 支持 Post Asset Folder 特性。在 _config.yml 中设置 post_asset_folder: true,然后将文档的 assets 目录重命名为与文章同名的目录,放在 source/_posts/ 下即可。Markdown 中的相对路径自动生效。

Hugo 博客

Hugo 推荐使用 Page Bundle。将 md 文件重命名为 index.md,连同 assets 目录一起放入 content/posts/文章名/ 目录。图片用相对路径引用,Hugo 构建时自动处理。

GitHub Pages / 仓库

最简单的场景。整个导出目录直接 commit 到仓库。GitHub 的 Markdown 渲染器支持相对路径图片,push 后立即可见。

Notion

Notion 导入 Markdown 时会自动上传本地图片到 Notion 自己的 CDN。你只需要确保导入时图片文件在正确的相对路径位置。导入后图片由 Notion 托管,不再依赖原始文件。

飞书文档

飞书支持 Markdown 导入,但图片需要手动上传或使用在线链接。建议先将图片上传到稳定的图床(如公司内部 OSS),再替换链接后导入。

想了解更多批量导出的操作细节?语雀批量导出完整教程有分步截图演示。

其他图片相关问题

除了普通的 PNG/JPG 图片,语雀文档中还会出现一些特殊格式的图片资源。根据我们处理过的 5000+ 篇文档样本,以下几类情况需要特别注意。

SVG 中内嵌的位图

语雀的画板功能导出为 SVG 时,画板中插入的图片会以 Base64 或外部链接的形式嵌入 SVG 文件。如果是外部链接,同样会遇到防盗链问题。YuqueOut 在处理画板导出时,会将 SVG 内的外部图片一并下载并转为内嵌 Base64,确保 SVG 文件独立可用。

GIF 动图

GIF 文件通常较大(单张可达 5-10 MB)。本地化时完整保留动画效果,不做压缩或转码。如果你的知识库中有大量 GIF 录屏,导出体积会显著增大。建议导出后用工具(如 FFmpeg)将 GIF 转为 WebM 或 MP4,能减少 80% 以上的体积。

超大图片的处理建议

部分用户会在语雀中粘贴未压缩的截图,单张可能超过 5 MB。本地化不会改变图片尺寸或质量。如果你需要部署到博客,建议导出后批量压缩。推荐使用 TinyPNG CLI 或 ImageOptim,可以在几乎不损失画质的前提下压缩 60-80% 的体积。

更多关于画板、表格等特殊文档类型的导出细节,可以看语雀特殊文档导出指南

常见问题

语雀导出的 Markdown 图片为什么显示不了?

语雀图片存储在 cdn.nlark.com,设置了 Referer 防盗链。只有来自 yuque.com 域名的请求才能加载图片。本地编辑器和第三方平台请求会被返回 403 Forbidden,导致图片显示为裂图。这是 CDN 层面的技术限制,不是文件损坏。

图片本地化后还会失效吗?

不会。图片本地化后文件存在你的硬盘上,Markdown 引用本地相对路径。不受防盗链限制,不受语雀服务变更影响。只要你不删除 assets 目录中的文件,图片就永久可用。

已经导出了没有图片的 Markdown 怎么办?

如果你之前用其他方式导出了不含图片的 Markdown,可以用 YuqueOut 重新导出。勾选图片本地化选项,工具会自动处理所有图片。也可以只导出单篇文档,用浮动气泡功能在文档页面一键导出。

图片本地化会影响导出速度吗?

会有一定影响,但通常可接受。每张图片下载耗时约 0.2-0.5 秒。一篇 30 张图片的文档,图片下载大约需要 6-15 秒。整个知识库(200 篇文档)的图片本地化通常在 10-15 分钟内完成。

总结

语雀图片防盗链不是 bug,是 CDN 的标准安全策略。但对迁移用户来说,这意味着导出的 Markdown 在任何非语雀环境下都无法正常显示图片。手动处理几千张图片不现实,写脚本有门槛且需要维护。

最省心的方案是在导出时就完成图片本地化。Chrome 扩展天然拥有浏览器登录态,能合法地下载所有图片并替换链接。导出后的文件自包含、可移植,无论用 Obsidian 打开还是部署到博客都能正常显示。

如果你正被语雀图片裂开的问题困扰,不妨试试一键导出方案,几分钟就能彻底解决。

一键解决语雀图片防盗链问题

免费安装 YuqueOut,导出时自动本地化所有图片

免费安装 YuqueOut