在 Cloudfront s3 分发中使用有序缓存访问被拒绝 (403)

Access Denied (403) with ordered cache in Cloudfront s3 distribution

我正在尝试使用具有有序缓存行为的云端添加多源设置。这是我想要实现的(假设我的 baseurl 是 https://example.com/

  1. https://example.com/ 显示来自根存储桶的 index.html。(root_app)
  2. https://example.com/app2 显示来自另一个存储桶 (app2)index.html

为此,我创建了一个 CF s3 分布,其中两个源(root、app2)指向两个不同的存储桶。在缓存行为中,我创建了有序缓存行为以将路径为“app2*”的所有流量路由到 app2 来源。

使用此设置 https://example.com/ 使我到达 root_app 但 https://example.com/app2 抛出以下错误

<Error>
<Code>AccessDenied</Code>
<Message>Access Denied</Message>
<RequestId>E1C4FA78C620F166</RequestId>
<HostId>nwVnR036HRHWVwiQoEoJQaj9A/Mf975SUYOoiYrgX8JasQCEWRrEeNTvBM5y327gZzcfCLksCDY=</HostId>
</Error>

我在浏览器中看到以下 http 响应 headers 以上请求

content-type: application/xml
date: Sun, 06 Sep 2020 06:34:06 GMT
server: AmazonS3
status: 403
via: 1.1 45645ff3269a2b885ffa1653e827d0f7.cloudfront.net (CloudFront)
x-amz-cf-id: vVTtxpNxuilWppQ2mskMvN-p7fbNBM8DqHvVYQMYV8-kH-4GVtRHNw==
x-amz-cf-pop: SFO20-C1
x-cache: Error from cloudfront

知道这个流程有什么问题吗?

问题在于 CloudFront 路由的工作方式。当有对 example.com/app2 的请求时,它将请求转发给 <bucket2>/app2 而不是 <bucket2>。您看到此错误是因为它不是您期望的 index.html。

您可以将 bucket2 中的文件移动到 app2 文件夹中,然后将路径模式更改为 /app2/*。这样,对 example.com/app2/ 的请求将转到 <bucket2>/app2/,这是您的文件所在的位置。

或者,您可以使用 Lambda@Edge 重写每个发往 bucket2 的请求的原始请求路径。我wrote an article如何解决类似的情况。