R
Rhys Weekly
归档 / 第 0 期

使用 Cloudflare R2 作为博客图床

第 0 期封面

从创建 R2 存储桶、绑定自定义域名,到配置缓存规则、防盗链和图片转换,完整记录博客图床的搭建过程。

使用 Cloudflare R2 作为博客图床

前提条件

域名已托管到 Cloudflare(NS 指向 Cloudflare),这样才能使用缓存规则、WAF、图片转换等功能。

创建 R2 存储桶

在 Cloudflare 控制台左侧找到「存储和数据库」→「R2 对象存储」,创建一个新的存储桶。

创建时可以设置位置提示(Location Hint),这只是给 Cloudflare 一个存储优先区域的建议,不是硬性的区域锁定。我的博客以中文读者为主,选择了亚太地区(APAC)。

绑定自定义图床域名

进入存储桶后,在「设置」→「自定义域」中绑定一个子域名作为图床地址。我用 i.rhys.imi 代表 image。

配置缓存规则

在 Cloudflare 控制台中,进入绑定域名的管理页面,找到「规则」→「缓存规则(Cache Rules)」,新建一条规则。

匹配条件:

(http.host eq "i.rhys.im")

将「边缘缓存 TTL」和「浏览器缓存 TTL」都设置为一年。图片内容基本不会变更,配置最长缓存时间可以显著减少回源请求。

同样在该域名的规则下,找到「配置规则(Configuration Rules)」,新建一条规则。

匹配条件:

(http.host eq "i.rhys.im")

开启「Hotlink 防盗链保护(Hotlink Protection)」。开启后,非本域名发起的跨域图片请求将被拒绝,防止其他网站直接引用你的图床资源。

启用图片转换(Image Resizing)

Cloudflare 支持通过 URL 参数动态调整图片尺寸和格式,请求路径格式为 /cdn-cgi/image/<参数>/<原始路径>

在控制台中找到「速度(Speed)」→「优化(Optimization)」,启用当前域名的「图片调整大小(Image Resizing)」功能。每月有一定免费配额,超出后按量计费。

配置 WAF 规则限制转换参数

由于图片转换按请求次数计费,如果不加限制,任意参数组合都可以触发一次计费转换,存在被滥用的风险。

在域名的「安全性(Security)」→「WAF」中新建一条自定义规则,只放行预设的几种尺寸规格,其余一律拦截:

(http.request.uri.path contains "/cdn-cgi/image/") and not (
  (http.request.uri.path wildcard "/cdn-cgi/image/width=800,format=webp/*") or
  (http.request.uri.path wildcard "/cdn-cgi/image/width=1400,format=webp/*") or
  (http.request.uri.path wildcard "/cdn-cgi/image/width=2000,format=webp/*")
)

这样只有 800px、1400px、2000px 三种宽度 + WebP 格式的组合能正常响应,既能覆盖常见场景,又能控制转换成本。

获取 API 令牌

在 Cloudflare 控制台右上角进入「我的个人资料」→「API 令牌」,创建一个新令牌。

权限选择「允许对象读和写(Object Read & Write)」即可满足图床上传需求。

注意:令牌值只在创建完成后显示一次,务必立即保存到图床工具中。

配置 PicList 上传工具

我使用 PicList 作为本地图床上传工具。R2 兼容 S3 协议,在 PicList 中选择「Amazon S3」图床类型,填入以下信息:

  • Access Key ID / Secret Access Key:填入上一步创建的 API 令牌凭证
  • Bucket 名称:R2 存储桶名
  • 自定义域名:如果需要使用图片转换,将域名后附加转换参数前缀,例如 https://i.rhys.im/cdn-cgi/image/width=1400,format=webp