- 个人开发者用Cloudflare Workers搭建免费图床,如何实现防盗链与图片压缩?

2026-08-15

个人开发者用Cloudflare Workers搭建免费图床,如何实现防盗链与图片压缩?

兄弟们,今天聊个实在话题。

我有个个人站点,写点技术博客,放些截图。之前图床用的是GitHub,速度嘛,国内看全看缘分。后来换成Cloudflare Workers搭了个免费图床,真香。但香归香,两个问题一直顶着腰眼子:一是被人盗链,流量分分钟被薅秃;二是原图太大,随便一张截图两三兆,页面加载像拉老牛。

先说盗链这事儿。

说白了,盗链就是别人家的网页直接引用你的图片链接,流量费他省了,账全记你头上。有哥们儿说“我加了防盗链头”,但你会发现,有时候管用,有时候不管用。为啥?因为Referer判断这招,太容易被绕过去了——直接在浏览器地址栏输入图片URL,Referer是空的,这就没法拦。

我的做法是在Workers里做个“门卫逻辑”:

  1. 检查Referer,非白名单域名的直接403。
  2. 但Referer为空的不拦,因为很多合规场景(比如微信里打开)本来就不带Referer。
  3. 加一道签名验证:上传时给每个图片生成一个带时效的token,链接里带上,超过24小时自动过期。

说白了,就像小区门口两个保安——一个拦闯门的,一个查访客码。双管齐下,基本能拦住99%的盗链党。

有朋友问,那我文章里的图片不就24小时失效了吗?对,所以我生成链接的时候用的是永久token,但独立在Cloudflare的Key-Value存储里放一个开关——如果某个链接被盗刷得厉害,我远程一键给那个token“拉黑”。这比改代码快多了,毕竟你半夜在被窝里被流量告警吵醒的时候,不想爬起来改代码。

再聊图片压缩。

这个就更接地气了。很多兄弟怕压缩影响画质,其实没必要。我那个破站主要放代码截图,压到80%质量,肉眼根本看不出区别,但体积能小70%左右。

如果你只是用Workers做转发,那Cloudflare自己有个图片转换的能力,你只需要在Workers里改一个URL参数,它就能把原图切成webp格式,还能指定宽度。我当时第一次看到这个效果,感觉就像去饭店点了个八斤重的大西瓜,结果服务员端上来一碟切好的小瓜块——你能吃,还不浪费,厨房还省了切瓜的力气。

但注意,这功能不是免费的,有配额,个人站够用。如果不想花钱,退一步,自己的Workers里写个压缩逻辑——用Canvas做压缩也行,但服务端处理大图的时候CPU消耗比较心疼。我的建议是:图床里存原始图,但出图的时候走一遍“瘦身管道”,输出出来的是960px宽的webp。碰上那种超大原图,哪怕对方盗链成功,他拿到的也是个小图,流量成本直接砍半,等于是他自己花流量盗了个寂寞。

真实场景举个例子:我发过一篇讲K8s排障的文章,里面有个截图原图2.4MB,通过Workers转了一圈,变成120KB的webp,页面加载速度从2.8秒掉到0.6秒。读者体验上来了,我自己的流量支出也降了,一个极验码两头通吃。

当然,光背靠Cloudflare还不够,有些“边角料”也得自己备着:比如你得防着某些人直接POST原图链接去刷你的Worker调用次数,所以Worker里的请求频率限制也得写一下,特别是同一个IP的请求,每10分钟最多允许拉50张图,超出就503。

最后总结一下我的完整链路:Worker入口做鉴权和防盗链 → 转发到存储桶拉取原图 → 带参数让CF压缩转格式 → 返回到浏览器缓存。这一整套,跑在每天10万次请求的免费额度里,个人站长完全够用。

写代码的过程其实不难,难的是你有没有想到这些细节。等你的图床也被人薅羊毛薅到冒烟的时候,你就懂了。

顺便推荐一下:如果你还在纠结云资源选型或者架构设计,可以去 itfangan.com 看看,上面有不少现成的落地方案,省得自己一个个坑踩过去。

好了,我去看我的Worker实时日志了,别我的图床又开始热闹了。