Cloudflare R2 上资源的 ERR_BLOCKED_BY_ORB 问题解决

最近开发一个 Web 项目,在本地用 pnpm dev 调用丢到 R2 服务上的 mock 图片时,图片突然都加载失败了,网络请求全都是 ERR_BLOCKED_BY_ORB 报错。

搜了一圈,从各种要求修改 HTTP Header 的错误方案中,最后定位到是 Cloudflare 的 Hotlink Protection 功能导致的。

这个功能本质上是防盗链,而且它很容易出现在一些“一键开启保护”或者“推荐安全配置”里,被顺手勾上之后,过一阵自己都未必记得。

解决方式

1. 直接关闭

如果只是想先快速恢复,最直接的方式就是把它关掉。

入口路径:

对应域名 -> 安全性(Security) -> 设置(Settings) -> 热链接保护(Hotlink Protection)

注意,这个入口是在具体的 domain 下,不是在 Cloudflare 后台 landing page 的总览层。

2. 通过规则处理

如果不想全局关闭,也可以通过配置规则的方式处理,只对特定资源路径,或者特定调用地址放开。

在上面 热链接保护(Hotlink Protection) 这个版块中,可以直接点击 创建配置规则(Create configuration rule) 进入配置。

我这里实际配了两条规则。

用途 字段 运算符
指定子文件夹开放 URI 完整 开头为 https://{YOUR-R2-BUCKET-DOMAIN}/{SUB-FOLDER}/
本地开发环境开放 引用方 包含 localhost

注意,添加规则后,还需要继续拉到下面的 Hotlink 保护 区域,点击 添加,把最终出现的开关设为关闭状态,且在页面的右下角点击 部署 才可以。

请把 https://{YOUR-R2-BUCKET-DOMAIN}/{SUB-FOLDER}/ 替换成你自己的 bucket 绑定域名和想开放的子目录

3. 使用 hotlink-ok 文件夹

Cloudflare 官方还提供了一个更简单的约定:

R2 bucket 内,任意深度的、名为 hotlink-ok 的文件夹中的文件,都会自动绕过 Hotlink Protection

如果只是想让部分资源跳过这个保护,这种方式会更省事。更多细节可以参考官方文档:Hotlink Protection - Cloudflare Docs

Blog