Cloudfront 到 s3 重定向到子域给出拒绝访问错误

Yun*_*nti 3 amazon-s3 amazon-web-services

我在 aws s3 上使用 Cloudfront 和路由 53 设置了一个静态网站。目前我可以通过以下方式正确访问该网站 https://www.example.com

我正在尝试重定向http://example.comhttps://example.comhttps://www.example.comhttp://www.example.com已经正确重定向)。

似乎设置它的唯一方法是使用两个 Cloudfront 分布和两个 s3 存储桶(以及路由 53 中的两个别名 A 记录)。

我已经配置了一个example.com存储桶以www.example.com使用 https 协议重定向。

其中一个 cloudfront 发行版指向www.example.com带有 http 到 https 重定向和默认根对象 asindex.html和备用域名的存储桶www.example.com 另一个 cloudfront 发行版指向example.com没有 http 到 https 重定向的存储桶,并且在默认根对象中没有设置任何内容(I'我也试过 index.html 但这没有帮助)和备用域名为example.com.

两个发行版在 ACM 中使用相同的证书设置,涵盖*.example.comexample.com (其他设置使用默认值)。

我不清楚为什么当我尝试通过https://example.com(或http://example.com)访问时出现访问被拒绝错误以及我的设置有什么问题?

<Error>
<Code>AccessDenied</Code>
<Message>Access Denied</Message>
<RequestId>....</RequestId>
<HostId>.....</HostId>
</Error>
Run Code Online (Sandbox Code Playgroud)

更新有关存储桶的更多详细信息:

正如下面评论中提到的,根域 s3 存储桶在没有 cloudfront 的情况下正确重定向。重新添加 cloudfront,访问被拒绝错误再次出现。

两个存储桶都有公共访问权限,即Block all public access设置为关闭。

两者的存储桶策略设置为:

{
    "Version": "2012-10-17",
    "Id": "Policy1595518880784",
    "Statement": [
        {
            "Sid": "Stmt1595518834954",
            "Effect": "Allow",
            "Principal": "*",
            "Action": "s3:GetObject",
            "Resource": "arn:aws:s3:::example.com/*"
        }
    ]
}
Run Code Online (Sandbox Code Playgroud)

对于子域存储桶,它..:::www.example.com/*在资源中有一个。

在 cloudfront 中使用的存储桶来源是example.com.s3.amazonaws.comwww.example.com.s3.amazonaws.com

Yun*_*nti 8

问题在于重定向存储桶前面的 cloudfront 分布。尽管 cloudfront 中 www 存储桶的源自动完成工作正常,但它不适用于重定向存储桶。相反,您需要手动添加它,它不是 s3 rest api 格式,而是静态站点版本。因此,改为输入以下形式的内容example.com.s3-website-us-east-1.amazonaws.comThis 看起来有点像 aws 控制台中的错误,它不应该在 s3 重定向存储桶之前自动完成无效的存储桶名称。

  • 是的,它看起来像一个错误。我已经挣扎了几个小时了。谢谢。 (2认同)

bad*_*ker 6

要解决“访问被拒绝”错误,您必须知道您的分配\xe2\x80\x99s 源域名是 S3 网站端点还是 S3 REST API 端点。尝试这个:

\n
    \n
  1. 打开 CloudFront 控制台。
  2. \n
  3. 选择您的 CloudFront 分配,然后选择分配设置。
  4. \n
  5. 选择“来源”和“来源组”选项卡。
  6. \n
  7. 查看“源域名”和“路径”下的域名,然后根据域名的格式确定终端节点类型。
  8. \n
\n

请记住,REST API 端点使用以下格式:

\n

AWSDOC-EXAMPLE-BUCKET.s3.amazonaws.com

\n

网站端点使用以下格式:

\n

AWSDOC-EXAMPLE-BUCKET.s3-website-us-east-1.amazonaws.com

\n

另外,不要忘记,如果您的发行版使用网站端点,请验证以下要求以避免访问被拒绝错误:

\n
    \n
  • 存储桶中的对象必须可公开访问。
  • \n
  • 存储桶中的对象无法通过 AWS Key Management Service (AWS KMS) 加密。
  • \n
  • 存储桶策略必须允许访问 s3:GetObject。
  • \n
  • 如果存储桶策略授予公共访问权限,则拥有该存储桶的 AWS 账户也必须拥有该对象。
  • \n
  • 请求的对象必须存在于桶中。
  • \n
  • 必须禁用 Amazon S3 阻止公共访问。
  • \n
  • 如果启用了请求者付款,则请求必须包含请求付款者参数。
  • \n
\n

最后,您可能想检查这些帖子:

\n

如何使用 CloudFront 为 Amazon S3 上托管的静态网站提供服务?

\n

I\xe2\x80\x99m 使用 S3 REST API 端点作为我的 CloudFront 分配的来源。为什么我会收到 403 访问被拒绝错误?

\n