跳转到内容
搜索文档

故障排除

最后更新 查看 MarkdownAgent 设置

排查 R2 的 403 / CORS 问题

如果您尽管已正确设置一切仍遇到 CORS 错误,可以按照本故障排除指南操作。

如果在浏览器控制台中 CORS 错误上方看到 401/403 错误,您遇到的是不同的问题(与 CORS 无关)。

如果确实是 CORS 问题,请参阅解决 CORS 问题

如果您使用自定义域名

  1. 在浏览器中打开开发者工具。
  2. 前往 Network(网络) 选项卡,找到失败的请求。您可能需要重新加载页面,因为只有在打开开发者工具后才会记录请求。
  3. 检查响应头中是否包含以下两个头:
  • cf-cache-status
  • cf-mitigated

如果您有 cf-mitigated

您的请求被 WAF 规则之一阻止。检查您的安全事件以确定阻止原因。

如果您没有 cf-cache-status

您的请求被防盗链保护阻止。

使用配置规则编辑防盗链保护设置,或完全禁用它。

如果您使用 S3 API

您的请求可能签名不正确。尝试通过 curl 发送请求可能会获得更清晰的错误消息。

请参阅示例页面上的 S3 签名示例。

如果确实是 CORS

以下是 CORS 配置的一些常见问题:

  • ExposeHeaders 缺少 ETag 等头
  • AllowedHeaders 缺少 AuthorizationContent-Type 等头
  • AllowedMethods 缺少 POST/PUT 等方法

对象级 API 令牌无法用于 REST API

如果您将对 Cloudflare REST API (api.cloudflare.com) 使用具有 Object Read & Write(对象读取和写入)Object Read only 权限创建的 R2 API 令牌,对象请求将无法通过身份验证,并返回以下之一:

  • 当令牌适用于所有存储桶时:{"code":10002,"message":"Unauthorized"}(HTTP 401)。
  • 当令牌限定于特定存储桶时:{"code":10000,"message":"Authentication error"}(HTTP 403)。

对象级令牌仅受 S3 兼容 API 支持,该 API 使用 AWS Signature Version 4 (SigV4) 进行身份验证。

要解决此问题:

  • 要继续使用对象级令牌,请通过 S3 兼容 API 而非 REST API 发起对象请求。S3 兼容 API 也更适合对象操作:REST API 有速率限制
  • 要使用 REST API,请使用 Admin Read & Write(管理员读取和写入)Admin Read only(仅管理员读取) 令牌进行身份验证。Admin 令牌授予账户范围的访问权限,而非存储桶范围的访问权限。

HTTP 5XX 错误和 Cloudflare R2 的容量限制

当您遇到 HTTP 5XX 错误时,通常表示您的 Cloudflare R2 存储桶被过多并发请求压垮。这些错误可能触发存储桶范围的读写锁,影响所有正在进行的操作的性能。

为避免这些中断,实施管理请求量的策略非常重要。

以下是一些缓解措施:

监控并发请求

跟踪存储桶的并发请求数量。如果客户端遇到 5XX 错误,请确保它重试操作并与其他客户端通信。通过协调,客户端可以集体减速,降低请求速率并保持更稳定的成功操作流。

如果用户直接上传到存储桶(例如使用 S3 或 Workers API),您可能无法监控或强制执行并发限制。在这种情况下,我们建议使用存储桶分片。

存储桶分片

如需以更高复杂度换取更高容量,请考虑存储桶分片。此方法将读写分布到多个存储桶,减少单个存储桶的负载。虽然分片无法防止单个热点对象耗尽容量,但可以减轻整体影响并提高系统弹性。

名为 This object is unnamed 的对象

在 Cloudflare 仪表板中,您可以通过选择 View prefixes as directories(将前缀显示为目录) 将名称中包含 / 的对象显示为文件夹。

例如,名为 example/object 的对象将显示如下。

  • example
    • object

/ 结尾的对象名称会导致 Cloudflare 仪表板将对象渲染为包含未命名对象的文件夹。

例如,将名为 example/ 的对象上传到 R2 存储桶将显示如下。

  • example
    • This object is unnamed

这篇文档对您有帮助吗?