AWS S3+Cloudfront静态网站子目录不起作用

Alb*_*ert 5 amazon-s3 amazon-web-services amazon-cloudfront

我正在尝试使用自定义域在 S3 中设置一个静态网站,并使用 CloudFront 处理 HTTPS。

问题是根路径可以正常工作,但子路径却不能。

显然,这都是关于我在两个地方都配置为index.html 的默认根对象。

  • example.com-> example.com/index.html-工作正常
  • example.com/about/-> example.com/about/index.html-因 NoSuchKey 错误而失败

有趣的是,如果我打开对 S3 存储桶的读取访问权限并使用 S3 URL,它工作得完全正常。

他们在一个AWS文档页面上讨论了这一点: https: //docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/DefaultRootObject.html,但他们甚至没有说解决方案,或者至少我没有说没能找到它。

但是,如果您定义默认根对象,则最终用户对发行版子目录的请求不会返回默认根对象。例如,假设 index.html 是您的默认根对象,并且 CloudFront 收到最终用户对 CloudFront 分配下的安装目录的请求:

http://d111111abcdef8.cloudfront.net/install/

即使安装目录中出现index.html 的副本,CloudFront 也不会返回默认根对象。

如果您将分配配置为允许 CloudFront 支持的所有 HTTP 方法,则默认根对象适用于所有方法。例如,如果您的默认根对象是 index.php 并且您编写应用程序以向域的根 ( http://example.com ) 提交 POST 请求,则 CloudFront 会将请求发送到 http://example.com /index.php

CloudFront 默认根对象的行为与 Amazon S3 索引文档的行为不同。当您将 Amazon S3 存储桶配置为网站并指定索引文档时,即使用户请求存储桶中的子目录,Amazon S3 也会返回索引文档。(索引文档的副本必须出现在每个子目录中。)有关将 Amazon S3 存储桶配置为网站以及索引文档的更多信息,请参阅 Amazon Simple Storage Service 开发人员指南中的在 Amazon S3 上托管网站一章。

S3 存储桶策略:

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "AllowCloudFrontAccess",
            "Effect": "Allow",
            "Principal": {
                "AWS": "arn:aws:iam::cloudfront:user/CloudFront Origin Access Identity XXXXXXXXXXXXXX"
            },
            "Action": "s3:GetObject",
            "Resource": "arn:aws:s3:::example.com/*"
        }
    ]
}
Run Code Online (Sandbox Code Playgroud)

云前设置: 在此输入图像描述

谢谢

Alb*_*ert 6

这个问题已经解决了,总结一下我所做的有两个解决方案:

  • 在 CloudFront 中添加S3 URL 作为自定义源需要权衡的是,这迫使我们为匿名流量打开 S3 存储桶
  • 设置Lambda@Edge来转换请求,代价是我们还要支付 Lambda 请求费用

因此,每个人都必须决定更适合的选项,就我而言,预计流量会非常低,所以我选择了第二个选项。

我留下了一些有用的链接,以防其他人遇到同样的问题: