Cloudflare R2 免费版防超额完全指南
一、免费额度与限制
Cloudflare R2 为所有用户提供慷慨的免费额度,即使企业用户也可以免费开始使用 R2。免费额度每月重置,以下是详细说明:
1.1 免费额度一览表
| 项目 | 免费额度 |
|---|---|
| 存储空间 | 10 GB/月 |
| Class A 操作(写入类) | 100 万次请求/月 |
| Class B 操作(读取类) | 1000 万次请求/月 |
| 出站带宽(Egress) | 完全免费,无限制 |
1.2 操作类型说明
Class A 操作(写入/修改类,成本较高):
PutObject(上传对象)CopyObject(复制对象)ListObjects(列举对象)ListBuckets(列举存储桶)CreateMultipartUpload(创建分片上传)UploadPart(上传分片)CompleteMultipartUpload(完成分片上传)PutBucketLifecycleConfiguration(设置生命周期)
Class B 操作(读取类,成本较低):
GetObject(下载/读取对象)← 这是最容易超额的操作HeadObject(获取对象元数据)HeadBucket(获取存储桶信息)
免费操作(不计入额度):
DeleteObject(删除对象)DeleteBucket(删除存储桶)AbortMultipartUpload(取消分片上传)
1.3 重要说明
- 免费额度仅适用于标准存储(Standard Storage),不适用于低频访问存储(Infrequent Access Storage)
- 存储计费采用 GB-month 计量方式,按 30 天内每天存储峰值的平均值计算
- 出站带宽(Egress)完全免费,这是 R2 相比 AWS S3 最大的优势
二、超额后如何计费
当免费额度用尽后,将按照以下标准计费:
2.1 标准存储超额价格
| 项目 | 超额价格 |
|---|---|
| 存储空间 | $0.015 / GB-月 |
| Class A 操作 | $4.50 / 百万次请求 |
| Class B 操作 | $0.36 / 百万次请求 |
| 出站带宽 | 免费 |
2.2 计费示例
示例 1:小型图床网站
假设你有 100,000 个文件,平均大小 100KB,每天读取 10,000,000 次:
| 项目 | 用量 | 免费额度 | 计费数量 | 费用 |
|---|---|---|---|---|
| 存储 | 100,000 × 100KB ≈ 10GB | 10GB | 0GB | $0.00 |
| Class A | 100,000 次写入 | 100 万 | 0 | $0.00 |
| Class B | 10,000,000 × 30天 = 3亿次 | 1000 万 | 2.9 亿次 | $104.40 |
| 合计 | $104.40 |
示例 2:正常使用
存储 5GB 文件,每月读取 500 万次:
| 项目 | 用量 | 免费额度 | 计费数量 | 费用 |
|---|---|---|---|---|
| 存储 | 5GB | 10GB | 0GB | $0.00 |
| Class A | 1 万次 | 100 万 | 0 | $0.00 |
| Class B | 500 万次 | 1000 万 | 0 | $0.00 |
| 合计 | $0.00 |
2.3 计费规则
- 向上取整:Cloudflare 会对用量向上取整
- 存储 1.1 GB 按 2 GB 计费
- 操作 1,000,001 次按 2,000,000 次计费
- 未授权请求不计费:返回 HTTP 401 的请求不会被计费
- 免费操作不计费:删除操作完全免费
三、防止超额的方法
3.1 方法一:设置缓存规则(最重要)
缓存是最有效的防超额手段。通过设置缓存,用户的请求会从 CDN 缓存或浏览器缓存获取资源,而不是每次都访问 R2 存储桶,从而大幅减少 Class B 操作次数。
3.1.1 设置页面规则(Page Rules)
操作路径:Cloudflare Dashboard → 你的域名 → 规则 → 页面规则
创建规则:
- 点击「创建页面规则」
- URL 填写:
img.yourdomain.com/*(替换为你的 R2 自定义域名) - 添加以下设置:
| 设置项 | 推荐值 | 说明 |
|---|---|---|
| 缓存级别 | 缓存所有内容 | 确保所有资源都被缓存 |
| 浏览器缓存 TTL | 8 小时 | 用户浏览器本地缓存时间 |
| 边缘缓存 TTL | 1 个月 | CDN 边缘节点缓存时间 |
原理:
- 浏览器缓存:用户访问后,资源保存在浏览器本地,再次访问直接使用本地文件
- 边缘缓存:资源缓存在最近的 CDN 节点,其他用户访问时从 CDN 获取,不回源到 R2
3.1.2 设置缓存规则(Cache Rules)
操作路径:Cloudflare Dashboard → 你的域名 → 规则 → 缓存规则
可以创建更精细的缓存规则,例如:
- 针对图片文件(
.jpg,.png,.gif,.webp)设置更长的缓存时间 - 针对 CSS/JS 文件设置适当的缓存策略
3.1.3 效果预估
设置缓存后,假设缓存命中率达到 95%:
- 原本 1000 万次请求 → 实际回源到 R2 的只有 50 万次
- 大幅降低 Class B 操作消耗,轻松控制在免费额度内
3.2 方法二:WAF 设置速率限制
通过 WAF(Web 应用防火墙)的速率限制功能,可以防止恶意刷流量和 DDoS 攻击。
3.2.1 创建速率限制规则
操作路径:Cloudflare Dashboard → 你的域名 → 安全性 → WAF → 速率限制规则
推荐配置:
| 设置项 | 推荐值 | 说明 |
|---|---|---|
| 规则名称 | R2 访问限速 | 自定义名称 |
| 匹配条件 | URI Path 包含 / 或特定路径 | 匹配 R2 资源路径 |
| 计数特征 | IP 地址 | 按 IP 统计请求次数 |
| 速率限制 | 100 次请求 / 1 分钟 | 根据实际业务调整 |
| 采取操作 | 拦截(Block) | 超限时阻止访问 |
| 持续时间 | 1 分钟 | 超限后阻止的时间 |
3.2.2 进阶配置
针对特定文件类型限制:
表达式:
(http.request.uri.path contains ".jpg" or http.request.uri.path contains ".png") and (not ip.src in $trusted_ips)按 Referer 限制:
表达式:
not http.request.uri.path contains "/public/" and (not http.referer contains "yourdomain.com")3.2.3 免费版限制
需要注意的是,Cloudflare 免费版的 WAF 速率限制规则有一定限制:
- 免费版只能创建 1 条 速率限制规则
- 部分高级特征(如按 Cookie 计数)需要付费版
建议将最严格的规则用在最容易被攻击的路径上。
3.3 方法三:设置图片防盗链
防盗链可以防止其他网站直接引用你的 R2 资源,避免被恶意盗用产生大量请求。
3.3.1 通过 WAF 自定义规则实现
操作路径:Cloudflare Dashboard → 你的域名 → 安全性 → WAF → 自定义规则
创建防盗链规则:
| 设置项 | 值 |
|---|---|
| 规则名称 | R2 防盗链 |
| 表达式 | 见下方 |
| 操作 | 拦截(Block) |
表达式(只允许指定域名访问):
(http.request.uri.path contains "/r2/" or http.request.uri.path contains "/img/") and not (http.referer contains "yourdomain.com" or http.referer contains "yourdomain2.com" or http.referer eq "")说明:
http.referer contains "yourdomain.com":允许来自你网站的请求http.referer eq "":允许直接访问(无 Referer 头),某些场景下需要保留
3.3.2 通过 Transform Rules 实现
操作路径:Cloudflare Dashboard → 你的域名 → 规则 → 转换规则 → 修改请求头
可以添加自定义逻辑,在 Referer 不匹配时返回 403 错误。
3.3.3 防盗链注意事项
- 防盗链是「防君子不防小人」,Referer 头可以被伪造
- 对于防止普通盗图、文章爬虫已经足够有效
- 建议配合其他方法一起使用
3.4 方法四:使用自定义域名
使用自定义域名(而非 R2.dev 默认域名)有以下优势:
3.4.1 好处
- 可控性强:出现问题可以随时断开域名与 R2 的关联
- 缓存支持:自定义域名才能使用 Cloudflare 的完整缓存功能
- 防盗链:需要自定义域名才能设置 Referer 防盗链
- 品牌形象:使用自己的域名更专业
3.4.2 设置方法
- 将域名托管到 Cloudflare
- 进入 R2 控制台 → 选择存储桶 → 设置 → 自定义域名
- 输入你的子域名(如
img.yourdomain.com) - Cloudflare 会自动添加 DNS 记录
3.5 方法五:合理使用对象生命周期
通过设置对象生命周期规则,自动管理存储空间。
3.5.1 设置方法
操作路径:R2 Dashboard → 选择存储桶 → 设置 → 生命周期规则
3.5.2 常用规则
| 规则 | 说明 | 适用场景 |
|---|---|---|
| 删除 x 天后未访问的对象 | 自动清理长期未使用的文件 | 临时文件、缓存 |
| 转换到低频访问存储 | 降低存储成本 | 归档数据 |
| 删除特定前缀的对象 | 批量清理特定目录 | 日志、临时上传 |
3.5.3 注意事项
- 低频访问存储(Infrequent Access)不享受免费额度
- 低频存储有最短 30 天的存储计费
- 建议使用标准存储并配合缓存,而非使用低频存储
3.6 方法六:监控与告警
3.6.1 查看使用量
操作路径:R2 Dashboard → 概览
可以查看:
- 当月存储用量
- Class A / Class B 操作次数
- 费用预估
3.6.2 设置通知
操作路径:Cloudflare Dashboard → 通知
可以设置以下告警:
- 费用超过阈值时通知
- 操作次数接近免费额度时通知
3.6.3 使用 Cloudflare Analytics
通过分析面板监控:
- 热门资源排行
- 请求来源分析
- 缓存命中率
四、最佳实践总结
4.1 推荐配置清单
| 优先级 | 配置项 | 作用 |
|---|---|---|
| ⭐⭐⭐ | 设置页面规则缓存 | 大幅减少回源请求 |
| ⭐⭐⭐ | 使用自定义域名 | 启用完整缓存和防护功能 |
| ⭐⭐ | 设置 WAF 速率限制 | 防止恶意刷流量 |
| ⭐⭐ | 设置防盗链规则 | 防止资源被盗用 |
| ⭐ | 设置通知告警 | 及时发现异常情况 |
4.2 免费额度够用吗?
适合免费额度的场景:
- 个人博客图床(图片数量 < 5000 张)
- 小型企业官网
- 个人项目、测试环境
- 配置了缓存的中小型网站
可能需要付费的场景:
- 大型图片分享网站
- 高流量的文件下载站
- 未配置缓存的热门网站
- 被恶意攻击的网站
4.3 关键提醒
- 缓存是第一道防线:95% 的请求应该由缓存处理
- 监控是必要的:定期查看 R2 使用量面板
- 不要过度依赖防盗链:Referer 可以被伪造
- 删除操作免费:不需要担心清理文件产生费用
- 出站流量免费:R2 的最大优势就是没有 Egress 费用
