前言
这两年博客文章的图片一直使用的 QQ 空间作为外链,去年一年没管,今年一看发现发现图片全挂了(防盗链)。
想着当初找了挺久的图床,以为不出意外大概能用个十多年,毕竟往推前十年,这个图床一直都没有问题,而且据我了解,知道这个渠道的人并不是很多。
但既然现在已经开了防盗链,也就只能去找相应的解决方案,碰巧当时正值新浪图床大规模开启防盗链,于是打算学习一下其他站长解决方案来解决自己博客的问题。
这一拖,便到这个月,在参考了《2023 年微博图床 403 全失效,一个方法秒解决! - 奔跑中的奶酪》之后,被迫选择了 wsrv.nl 的图片缓存服务来解决博客的图床外链问题,但因为该服务使用是国外服务,在访问速度上总觉得差强人意。
今天不知道脑子抽了哪门疯,突然就想解决一下这个问题,于是便有了本文的由来。
原理
本文采取的解决方案是使用“图片缓存服务”来解决平台防盗链的问题,在讲具体原理之前,我们先了解一下防盗链的实现,常见的防盗链形式一般有插入图片链接不显示图片、插入图片链接显示统一防盗图片等(具体见下图),而图像存储平台判断图片是否本平台正常引用的条件为判断 HTTP 请求来源,再反馈相应的 HTTP 请求代码。
图片来源:奔跑的奶酪
什么是 HTTP 状态码
当浏览者访问一个网页时,浏览者的浏览器会向网页所在服务器发出请求。当浏览器接收并显示网页前,此网页所在的服务器会返回一个包含 HTTP 状态码的信息头(server header)用以响应浏览器的请求。
HTTP 状态码一共分为 5 种类型:
100 - 客户端应继续其请求
200 - 请求成功
301 - 资源(网页等)被永久转移到其它URL
404 - 请求的资源(网页等)不存在
500 - 内部服务器错误
图片来源:奔跑的奶酪
这里涉及到 HTTP 请求具体流程,就不过多展开,简单来说就是当我们网站请求图片地址后,平台会判断 HTTP 请求头中的 Referer 信息,也就是请求网站地址,如果不是平台白名单地址就拒绝请求,或在请求时直接以下载方式打来,而不允许浏览器直接显示该图像资源。
而图片缓存服务有可能是我们通过缓存平台直接请求了图像地址,而规避了直接请求图像地址时图像存储平台进行的相应操作。
解决
本文测试图片存储平台为语雀,语雀官方不允许直接在浏览器中直接打开图片,而只能下载查看。
所以正常情况下,能使用该图片缓存服务在浏览器中正常显示语雀图片的,也能正常显示其他图像存储平台的图片。
搜狗图片
https://img02.sogoucdn.com/v2/thumb/retype_exclude_gif/ext/auto/q/95/crop/xy/ai/t/0/?appid=122&url=
https://img02.sogoucdn.com/v2/thumb/retype_exclude_gif/ext/auto/q/95/crop/xy/ai/t/0/?appid=122&url=https://cdn.nlark.com/yuque/0/2023/png/1553018/1688745286311-13621a67-9d18-41c1-931f-dbceaccb4950.png
使用:接口地址+图片地址(无请求头要求)
域名信息
Ping检测
评语
国内大厂,多节点,访问速度快,但接口可能不稳定,失效之后可从搜狗图片自行抓取
百度图片(仅支持新浪等)
https://image.baidu.com/search/down?url= https://gimg2.baidu.com/image_search/&app=2020&src=图片地址
https://image.baidu.com/search/down?url=https://tvax4.sinaimg.cn/large/006BNqYCly1hfsl2jlg0oj30mj0fz0vp.jpg
域名信息
Ping检测
评语
国内大厂,多节点,访问速度快,但接口可能不稳定,且仅能微博图床,无法在浏览器中直接打开
广西某讯
http://collect34.longsunhd.com/source/plugin/yzs1013_pldr/getimg.php?url=
http://collect34.longsunhd.com/source/plugin/yzs1013_pldr/getimg.php?url=https://cdn.nlark.com/yuque/0/2023/png/1553018/1688745286311-13621a67-9d18-41c1-931f-dbceaccb4950.png
使用:接口地址+图片地址(无请求头要求)
域名信息
国内测速
评语
虽然是一家私企,但是感觉规模不小,且主要业务均是Dang{过滤}政一类的业务,且该接口最早被索引在2021年之前,较为稳定。
weserv.nl
https://images.weserv.nl/?url=
https://images.weserv.nl/?url=https://cdn.nlark.com/yuque/0/2023/png/1553018/1688745286311-13621a67-9d18-41c1-931f-dbceaccb4950.png
域名信息
Ping检测
评语
老牌图像缓存服务商,较为稳定,但速度一般。
noobzone
https://img.noobzone.ru/getimg.php?url=
https://img.noobzone.ru/getimg.php?url=https://cdn.nlark.com/yuque/0/2023/png/1553018/1688745286311-13621a67-9d18-41c1-931f-dbceaccb4950.png
Ping检测
评语
俄罗斯的图片缓存服务,速度一般,建议不用。
WordPresss
i0.wp.com/ i1.wp.com/ i2.wp.com/ i3.wp.com/
http://i0.wp.com/cdn.nlark.com/yuque/0/2023/png/1553018/1688745286311-13621a67-9d18-41c1-931f-dbceaccb4950.png
域名信息
Ping检测
评语
WordPress 旗下图像缓存服务,速度较慢,可以备用。
其他备用
https://cdn.cdnjson.com/
CdnJson 提供的图像缓存服务,可以加速新浪微博/知乎等开启防盗链的图片,需要去掉 http/https 协议。
https://cors.zme.ink/
基于 Cloudflare Workers 搭建的跨域代理缓存服务,可以缓存所有内容,需要加 http/https 协议。
https://www.codenong.com/getimg_baidu.php?url=
说是香港的图片缓存服务,实际不清楚(套了 CDN),支持大部分的图片链接,必须加 http/https 协议。
SQL一键替换
UPDATE wp_posts SET post_content = REPLACE( post_content, 'https://tvax1.sinaimg.cn/', 'https://image.baidu.com/search/down?url=https://tvax1.sinaimg.cn/' )
注意:在操作前记得备份一下数据库,即使操作不当也能及时回滚。