为什么 CloudFront returns 仅在授予 List 权限时才自定义错误对象?

Why CloudFront returns custom error object only when List permission is granted?

我注意到,如果存储桶的列表权限未授予 public,CloudFront 的自定义错误页面(在我的情况下未找到 404)总是 returns 403 禁止。授予列表权限后,可以返回自定义 404 图片。

我的

None 个对象被明确标记为 public 仅可读。但我已为存储桶中的所有对象授予 CloudFront 原始身份读取权限。所以我假设,当 CloudFront 试图获取不存在的对象时,它找不到;然后它会尝试列出所有对象以找到目标;因此,许可被拒绝。这部分让我很困惑。如果目标存在时不需要列表权限,为什么 CloudFront 在第一步找不到原始目标时不直接获取给定的自定义错误对象?列出对象只是为了确认 404 状态吗?

当 Cloudfront 在没有列表权限的情况下尝试访问不存在的密钥时,403 直接来自 S3。 Cloudfront 不会尝试发出第二个请求来列出对象或类似的东西。当 Cloudfront 试图访问一个不存在的对象时,S3 直接 returns 一个 403。

当您尝试在没有列表权限的情况下访问不存在的密钥时,S3 returns 返回 403 响应而不是 404 的原因是,如果没有权限,您将无法区分这两种情况:

  1. S3 密钥存在但权限不允许访问该对象
  2. S3 密钥不存在

如果您可以区分它们,您可以通过枚举可能的键并检查 403 和 404 响应来有效地列出存储桶的内容。没有列表权限是不允许的,因此这两个场景必须具有相同的响应才能区分。它们可以都是 403,也可以都是 404,但 403 更合适,因为它代表 "Forbidden"。如果没有列表权限,您 "Forbidden" 无法知道是否存在具有该键的元素。

它并不真正适用于存储桶中的所有对象都可以访问的情况,但是如果您的存储桶中只有一个对象是秘密的,并且您不希望没有列表权限的人知道它在那里你会欣赏 S3 没有通过返回 403 而不是 404 来揭示它的存在特定 url。 S3的规则适用于不能确定桶中的所有对象是否都可以访问,甚至不能确定它们的存在是否应该被检测到的一般情况。