R2 的 bucket 怎么公开访问?

如果你用 WAF 或 Access 保护了 R2 bucket,却没关 r2.dev,bucket 仍然能通过那个子域名被公开读取,你配的规则被整个绕过。

生产环境用自定义域名,r2.dev 只适合开发测试。自定义域名可以走 Cloudflare Cache、WAF 和 Access,代价是开了缓存后,覆盖写之后旧内容还会被提供一段时间。

两种方式的差别,加上缓存对一致性的影响,决定了你该怎么设计 key。下面逐个讲。R2 本身的一致性模型见 Cloudflare R2 适合存什么数据?。

r2.dev 能上生产吗?

不能。官方文档明确它只用于开发测试:有速率限制,超出会 429;没有缓存,没有 WAF 自定义规则,没有 Access,也没有 Bot Management。

自定义域名有什么不同?

可以走 Cloudflare Cache、WAF、Access。默认只缓存部分文件类型,要缓存全部需要 Cache Everything 规则。

如果你靠 WAF 或 Access 保护 bucket,务必关掉 r2.dev,否则规则被绕过。

开了缓存会读到旧内容吗?

会。自定义域名开启缓存后不再强一致:被删除或覆盖的对象可能继续被缓存提供,404 也可能被缓存,直到 TTL 过期或手动 purge。

吞吐和延迟因此更好,代价是陈旧。Worker 绑定和 S3 API 绕过缓存,不受影响。

怎么避免读到旧内容?

用不可变 key:文件名带内容哈希或版本号,永不覆盖。这样缓存不会陈旧,也规避了同 key 每秒 1 次写入的限制。

必须覆盖同一个 key 时,有两个办法:写完主动 purge,或者让需要新鲜数据的路径走 Worker 绑定。

本文关于 r2.dev 的限制、自定义域名的缓存行为和一致性例外,都来自官方文档(2026-10),我没有在本地复现过,本地模拟也无法验证缓存与限流。这些行为会变化,以官方文档为准。