做博客最扫兴的一刻,是把一篇微信文章搬过来,排版都调好了,打开预览,图全变成裂开的小图标。我第一次遇到时还以为是自己代码写错了,查了半天才搞明白,问题出在微信的图片防盗链。
这篇文章写一个我亲测能用的解法,用 GitHub 公开仓库存图,再用 jsDelivr 这个免费 CDN 把图发出来。整套不花一分钱,不用备案,国内访问也稳。读完你能给自己搭一个长期可用的图床,也能顺手把历史上传过的微信图批量搬过去。
你需要的东西很简单,只要一个 GitHub 账号。会一点 git 更好,不会也没关系,文章里给了不敲命令、直接网页拖拽的上传法。最容易卡住的有两处,一是链接格式写错导致图还是不显示,二是仓库越塞越大以后推送变慢,这两点我后面专门讲。
为什么图会破微信文章里的图,地址是 https://mmbiz.qpic.cn/mmbiz_png/... 这种样子,关键在那个域名 mmbiz.qpic.cn。微信在那台服务器上做了防盗链,它会看请求来自哪个网站(技术上讲是 HTTP 请求头里的 Referer)。从微信自己的页面点开,Referer 是微信的域,图正常返回;从你自己的博客打开,Referer 变了,服务器直接拒绝,浏览器只能显示裂图。
锅在微信的图片防盗链。微信不让外站白嫖它的图,所以你代码写得再对,图也显示不出来。直接把 mmbiz.qpic.cn 的链接贴进自己网页的 img 标签,在微信里看没事,在自己站上看必破。
直接引原链接,如上,破。
找过几个免费图床,要么容量小,要么隔阵子就挂,还有的要登录验证才能传,长期用不放心。
也考虑过买对象存储,一算账,博客才起步,为几张图开个套餐不划算。
后来我想要的就是三件事,免费、稳定,而且文件在我自己手里。GitHub 加 jsDelivr 刚好都满足。
用 jsDelivr 加 GitHub 搭图床先说这两样是什么。GitHub 你大概知道,存代码的地方,能建公开仓库,里面的文件有个固定网址可以直接访问。jsDelivr 是一个免费的公共 CDN,专门做一件事,把 GitHub 公开仓库里的文件,通过离用户更近的节点发出来,速度比直接拉 GitHub 快,还自带缓存。
关键是 jsDelivr 不认防盗链,你仓库里有什么它就发什么。这就绕开了微信的限制。
第一步 建一个公开仓库
登录 GitHub,新建仓库,名字随便取,比如 my-cdn。可见性一定要选 Public(公开),私有的 jsDelivr 读不到。
第二步 把图传上去
最省事的办法,在仓库页面点 Add file,把图片直接拖进去,写个提交说明,点 Commit changes,图就进仓库了。
会 git 的话也能本地推上去
git init
git add .
git commit -m "add images"
git branch -M main
git remote add origin https://github.com/你的用户名/my-cdn.git
git push -u origin main
第三步 拼出图片链接
jsDelivr 的链接格式长这样
https://cdn.jsdelivr.net/gh/你的用户名/仓库名/图片在仓库里的路径
你的仓库里 242/1.png 这张图,链接是下面这样
https://cdn.jsdelivr.net/gh/你的用户名/my-cdn/242/1.png
我自己的博客就用这套。下面这串是真实链接,你现在打开它就能看到图。
https://cdn.jsdelivr.net/gh/Axinchaoshan/axing-cdn/242/1.png
第四步 在网页里用
把上面那串链接放进 img 的 src 就行
<img src="https://cdn.jsdelivr.net/gh/你的用户名/my-cdn/242/1.png" alt="说明">
到这一步,你的图再也不怕防盗链了。
进阶 整站图片批量搬如果你像我一样,已经搬了两百多篇文章,图全在微信服务器上,一张张下、一张张传、再一篇篇改链接,能干但人得疯。我写了个脚本批量处理,思路不复杂,你照着也能写一个。
核心四步。
第一,扫一遍所有文章,找出里面 mmbiz.qpic.cn 的图链接。
第二,把这些图下载到本地,按文章编号建文件夹,比如 242/1.png、242/2.png。下载时顺手校验一下,确认下回来的是真图片而不是微信回的一句报错,微信拒绝时常常返回一段网页代码。
第三,把文章里的原链接,逐条替换成对应的 jsDelivr 链接。
第四,把本地图片文件夹推到 GitHub 仓库。
我那个脚本还加了断点续传,已经下过的图跳过,下次跑只处理新增的,失败了记进日志不中断。全站跑完,两百多篇的图就全换成自己的图床了。
几个容易踩的坑链接格式最容易写错。jsDelivr 用的是 cdn.jsdelivr.net/gh/用户名/仓库,不是 GitHub 网页那个 raw.githubusercontent.com 的地址,两个长得像,用错就 404。
改完图想立刻生效,可能要等 jsDelivr 刷新缓存。它一般几分钟就更新,急的话去 jsDelivr 官网有个 purge 工具,贴链接强制刷新。
仓库别塞太大。jsDelivr 对单文件大小有限制,大约 20MB,图片太多建议按文章分文件夹,也方便管理。上传前把图压一压,博客图宽度一千像素出头、质量 80% 左右,肉眼几乎看不出差别,体积能小一大半。
图床这东西,文件在你自己仓库里最踏实。哪天 jsDelivr 不顺心,换个别的 CDN 指到同一个仓库就行,链接逻辑不用重来。