【问题标题】:Access Denied (403) with ordered cache in Cloudfront s3 distribution在 Cloudfront s3 发行版中使用有序缓存拒绝访问 (403)
【发布时间】:2020-09-06 05:40:19
【问题描述】:

我正在尝试使用具有有序缓存行为的云端添加多源设置。这是我想要实现的(假设我的 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 响应标头

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

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

【问题讨论】:

  • 似乎第二个存储桶拒绝访问。是否使用存储桶策略设置为公开,或者您是如何设置的?
  • 设置为允许公共访问。 index.html 文件也是公开的。
  • @Krishnom 查看 两个 存储桶的 S3 日志以查找来自 CloudFront 的请求。

标签: amazon-web-services amazon-s3 amazon-cloudfront http-status-code-403


【解决方案1】:

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

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

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

【讨论】:

  • 谢谢@Tamas 虽然,不是我所期望的,但确实有效。 (为第二个存储桶中的路径创建文件夹)。正如您所说,Lambda@Edge 是这里的一个选项,这是我更喜欢使用的选项。我阅读了文档,发现 Lambda URl 重写是一个适合 terraform 流程的长期解决方案。
猜你喜欢
  • 2021-06-26
  • 2017-07-04
  • 2020-02-29
  • 2021-07-25
  • 2017-10-03
  • 2015-05-21
  • 2015-02-13
  • 2022-01-11
  • 2021-03-06
相关资源
最近更新 更多