图床选型绕不开一个坑:存储便宜,流量贵。传统对象存储存储费没几个钱,图片一旦被外链盗用,出站流量费能给你干到怀疑人生。
Cloudflare R2 的杀手锏是出站流量免费(zero egress):每月 10GB 存储、100 万次 A 类操作、1000 万次 B 类操作,个人图床用不完。
数据怎么流

你(客户端/S3 API)→ R2 Bucket → 绑定的自定义域名走 Cloudflare CDN → 访客。图片从最近的边缘节点出,快,且不计出站费。
操作步骤速览

一、建 Bucket 并绑域名

面板 → R2 → Create bucket,起个名,比如 img。进 Bucket → Settings → Public access → 连接一个自定义域名(比如 img.example.com),域名要托管在同一个 Cloudflare 账号下。
别用 R2 自带的 r2.dev 测试域名——那个有速率限制,只适合临时验证。
二、用 rclone 批量上传

rclone config
# 选 n (new) -> 存储类型选 s3 -> provider 选 Cloudflare
# 填 access key / secret / endpoint: https://<accountid>.r2.cloudflarestorage.com
rclone copy ./images r2:img --progress
本地当图床用、S3 兼容、还能写进脚本自动传——这是 R2 比纯图床省心的地方。
三、防盗链

两种做法,按需求选:
① Cloudflare 的 Referer 规则(零代码):Security → WAF → 自定义规则,加一条——当 Referer 不来自你自己的域名时,Block。适合绝大多数场景。
② Worker 校验签名:图片 URL 带时效签名,过期即失效。适合付费内容、私域资料。前者够用就不要上后者。
四、顺手把缓存设好

R2 经自定义域名走的是 Cloudflare CDN,给图片加一条缓存规则:Cache Rules → 匹配 img.example.com/* → Edge TTL 设为一个月。图片是静态资源,长缓存能让命中率飙到 90% 以上。
小结
图床的账要算两笔:存储和流量。R2 把流量那笔直接抹平了,剩下的 10GB 存储对个人站几乎是白送。预算被流量费吃掉的痛,只有被吃过一次才知道。
唯一的门槛是自定义域名要托管在 Cloudflare——如果你本来就用它做 CDN,这一步等于没有成本。
常见问题
R2 真的没有出口流量费吗?
是的,R2 出站流量免费,这是它相对传统对象存储最大的区别;只对存储量和操作次数计费。
可以用 r2.dev 的测试域名吗?
只建议临时验证。r2.dev 域名有速率限制,正式使用要绑定托管在同一 Cloudflare 账号下的自定义域名。