准备
创建托管图片的存储桶
登录 Backblaze,然后单击B2 Cloud Storage下左侧的Buckets,然后单击Create a Bucket。将存储桶设为公开(public),将其他设置默认即可。
Backblaze B2 的桶名不能重复 全球唯一

上传的图片,查看属性值,将Friendly URL里面的主机名记下来,这里是f005.backblazeb2.com https://f005.backblazeb2.com/file/bucket-name/123456.jpg
为图床域名添加CNAME解析
登录cloudflare,新增域名解析指向上面获取的主机名f005.backblazeb2.com
保存完毕后,再在左侧列表点击SSL/TLS,将加密模式从“flexible(灵活)”更改为“full(完全)”
重写 URL,隐藏bucket名称
单击Cloudflare仪表板左侧的规则,然后单击转换规则,在重写URLtab下的创建规则。
- 规则名称
Backblaze存储地址重写 - 添加匹配规则
(http.host eq "自定义主机名称" and not starts_with(http.request.uri.path, "/file/自定义的桶名称" )
-) - 添加Dynamic重写规则
concat("/file/自定义的桶名称",http.request.uri.path)
完成后如图所示
点击部署,现在可以用你自定义的域名测试下了,举个例子:
- 原始地址为:
https://f005.backblazeb2.com/file/自定义的桶名称/test.png - 重写之后地址为:
https://files.example.com/test.png
这里的配置实现了 {your_domain}/xxx.jpg -> Friendly domain/file/{bucketName}/xxx.jpg 的转换,既不会暴露自己的桶名称,还缩短了 URL。
其他调整
删除HTTP标头
图片在响应时有一些X-Bz开头的字段,这些都是和Backblaze云存储相关的,要把它们都隐藏掉。
Cloudflare仪表板–>规则–>转换规则–>修改响应头–>创建规则
移除下面这些header请求头。
1 | X-Bz-Content-Sha1 |
backblaze缓存设置
进入backblaze后台,点击Buckets中Bucket Settings设置,设置Bucket Info为{"cache-control":"public,max-age=5184000"},5184000秒(也就是60天),最后点Update Bucket保存设置。
设置之后Cloudflare会缓存数据到自己cdn服务器上,减少请求backblaze的流量,节省用量。
cloudflare配置缓存规则
进入cloudflare控制台,缓存–>Cache Rules,创建新缓存规则
- 匹配规则
(http.host eq "图床域名") - 缓存资格:选择
符合缓存条件 - 边缘TTL:选择
忽略缓存控制标头,使用此 TTL,缓存时间设置为一个月 - 浏览器TTL:选择
替代源服务器,使用此 TTL,缓存时间设置为一个月 - 缓存密钥:开启
缓存欺骗盔甲
b2私人桶通过Cloudflare Worker实现外围访问
我们使用CloudFlare Worker定时更新重写URL规则,所以需要先为这个Worker创建一个API令牌。进入我的个人资料 API令牌,然后点击创建令牌,在接下来的页面中中选择创建自定义令牌,然后如图创建一个令牌。

添加成功后,妥善保存这个令牌。CfAuthKey
接下来我们需要知道要修改的规则,规则集等ID。
CfRulesetID: 在重写URL规则那里修改一下规则,内容随意,之后在 管理帐户 –> 审核日志 如下图找到我们需要的规则集ID。

通过cf提供的api获取规则集id
1 | GET https://api.cloudflare.com/client/v4/zones/YOUR_ZONE_ID/rulesets |
YOUR_ZONE_ID 换为你的域名的区域 ID。YOUR_CLOUDFLARE_API_TOKEN 换成你的 API 令牌,这里我创建使用了读取所有资源 模板API令牌。
这个请求会返回一系列规则集,有 CloudFlare 内部的,也有我们自己的。理论上,名字是 default 并且 phase 是 http_request_transform 的那个就是我们要的。
CfRuleID: 打开上面定义的重写url规则,在规则的编辑页面里面,url地址的最后一段就是规则的D。
通过cf提供的api获取规则id
1 | GET https://api.cloudflare.com/client/v4/zones/YOUR_ZONE_ID/rulesets/RULE_SET_ID |
RULE_SET_ID 替换为上面找到的规则集的 id。
前往 CloudFlare Workers,创建一个新的 Worker。然后到设置 –>变量,添加如下环境变量:
| 量名 | 值 |
|---|---|
| B2KeyID | Backblaze 的 keyID |
| B2AppKey | Backblaze 的 applicationKey |
| B2BucketName | Backblaze 的存储桶名 |
| CfAuthKey | 上面创建的 CloudFlare API 令牌 |
| CfHostname | CloudFlare CNAME好的二级域名 |
| CfZoneID | 你的域名的区域 ID |
| CfRulesetID | 上面拿到的规则集 ID |
| CfRuleID | 上面拿到的规则 ID |
在 设置–>域和路由 点击禁用,因为我们不会用 HTTP 请求来触发这个 Worker。
在 设置 –>触发事件 中添加一个 Cron触发器,BackBlaze的文档说一个 Token 的有效期最大不超过 24 小时,这里每1个小时触发一次woker,更新token ,0 */1 * * *。
至此前置任务完成,点击右上角的快速编辑,然后将如下脚本粘贴进去,然后点击保存并部署。
1 | addEventListener("fetch", (event) => { |
等 Worker 被触发之后,就可以在浏览器中访问上面配置的域名,来测试到存储桶的连接是否正常。如果测试没问题,就可以把博客中的图片链接换到新地址了。