免费图床,我用 Backblaze + CloudFlare 做到了

2023-02-17 • ☕️ 7 min read

B2 是 Backblaze 提供的一个 OSS 存储服务,有着 10G 的免费容量以及每天 1G 的免费流量,而且 B2 还是 Cloudflare 带宽联盟的成员。

带宽联盟是 Cloudflare 提出的,旨在降低数据传输费用。有很多国际大厂都加入了这个联盟,当然包括今天说的 Backblaze。

通过 Cloudflare 的 CDN 加速 B2 使所有流量全免费,加上 B2 的 10G 免费容量,实现 0 成本的图床,所以博客文章的图片有着落了!

准备

需要注册 Cloudflare 和 Backblaze 的帐户,一个自己的域名,建议使用二级域名,一个上传图片的程序:

  1. Backblaze 账号
  2. Cloudflare 账号
  3. 域名
  4. FileShip(自制浏览器插件用来上传 B2 文件)

创建托管图片的存储桶

登录 Backblaze,进入 Backblaze 的用户管理界面,然后单击 B2 Cloud Storage 下左侧的 Buckets,然后单击 Create a Bucket。创建时需要输入 Buckets 的名称,这个名称必须是全局唯一的,不能与其它 Buckets 的名称重复。将存储桶设为公开(public),其他设置默认即可。

给存储桶起名时尽量起不易被别人猜测的名字,可在其中增加部分随机字符,如 n129js-example,因为在存储桶的模式为 Public 时,别人只需知道你的 OSS 服务提供商 + 存储桶名称 + 其中一个文件名,即可拼凑出文件真实链接,从而绕过 CDN 刷空你的免费流量,如果有绑定支付方式还会扣费。

刚创建的存储桶默认不会被 Cloudflare 缓存,而是每次都要回源,对于图床来说,缓存下来才更方便。点击桶选项,回到刚才创建存储桶的地方,可以看到已经创建好的存储桶,点击桶设定,将桶信息修改为{"cache-control":"max-age=43200"},其中 max-age=后面的数字为 Cloudflare 的缓存时长,单位为秒。

然后在点击 Upload/Download 上传一张图片或临时文件后,进入创建的存储桶并找到上传的文件,点击查看详细信息中的 Friendly URL,当然此时我们是可以直接访问该链接读取文件,但是会消耗 Backblaze 每天 1G 的免费流量。为了达到薅羊毛的目的,请接着往下看。

b2-bad-name

⭐️记住 Friendly URL 中的主机名,如上图我的主机名是 f005.backblazeb2.com

接下来,我们的目标就是将这个 https://f005.backblazeb2.com/file/codeep/logo.png URL 变成 https://img.codee.xyz/logo.png

为图床域名添加 CNAME 解析

登录 Cloudflare,点击添加站点,将准备好做图床的域名添加到 Cloudflare,具体添加步骤可以根据 Cloudflare 的指示来操作。

来到 Cloudflare DNS 面板,添加一条 CNAME 记录,将其指向刚才记录下的主机名 f005.backblazeb2.com,由于要使用 Cloudflare 的 CDN 进行缓存,记得打开云朵。

b2-bad-name

在创建 CNAME 记录之后,将友好 URL 的主机名换成刚创建的域名就可以访问文件了。

替换后主机名:https://img.codeep.xyz/file/codeep/logo.png

如果测试时 Cloudflare 提示错误 522,这是因为 Backblaze 只允许使用 Https 访问,需要在 Cloudflare 的 SSL/TLS 中改成完全(严格)。

这时候已经可以通过自己的域名来访问刚才上传的图片了,并且还有 Cloudflare 的 CDN 缓存。但是图片链接里会包含自己的存储桶名字,为了钱包的安全起见,还是要再折腾下。

优化图床链接名称

可以通过 Cloudflare 转换规则,使用单独的子域名作为专用的图床域名。

Cloudflare 的转换规则分为三种:

  • URL 重写规则:重写 HTTP 请求的 URL 路径和查询字符串。
  • HTTP 请求头修改规则:设置 HTTP 请求头的值或删除请求头。
  • HTTP Response Header 修改规则:设置 HTTP 响应头的值或移除响应头。

我们需要用的是 URL 重写规则,单击 Cloudflare 仪表板左侧的 Rules,然后单击 Transform Rules,你会看到👀 Cloudflare 免费计划包含 10 条转换规则——对于我们羊毛党的目的来说已经足够了,点击 Rewrite URL,然后单击 Create Rules

编写自定义表达式匹配图床的 URL 地址

cf-b2-expression.png

匹配表达式配置完成后,在下面的 Path 中选择 Rewrite to,在选项中选择 Dynamic,如果只想在 URL 中删去/file/存储桶名称的话,在后面填写concat("/file/存储桶名称", http.request.uri.path)

cf-b2-rewrite-rules

设置完成后点击部署即可启用该规则。

图片上传

上面所有步骤都设置完成后,此时需要一个方便好用的图片上传工具,毕竟每次上传都要打开 Backblaze 管理界面是痛苦的事情。基于我日常都是在浏览器中浏览信息,所以造了个可以直接拖拽网页图片上传至 Backblaze 的浏览器插件,这个插件改为在另一篇文章分享。

总结

通过上面的步骤,我们实现了几点:

  • 利用 Backblaze B2 的 10G 免费存储空间作为对象存储。
  • 借助 Cloudflare 的全球 CDN 网络和免费带宽,实现 B2 数据的快速访问。
  • 使用 Cloudflare 的 URL 重写规则,优化图床链接,隐藏实际的存储桶信息。
  • 最终实现一个免费、高速、安全的图床方案。

综上所述,合理运用 Backblaze 和 Cloudflare 的免费服务和功能,我们可以打造一个 0 成本、可无限扩展的私人图床。非常适合个人博客、小型网站使用。

当然,免费服务有限制,如果需要更高性能、更大存储,可以考虑付费升级 Backblaze 和 Cloudflare 的计划。本文提供了一个可参考的零成本方案,欢迎根据实际需要进行调整优化。