【问题标题】:Amazon CloudFront Doesn't Respect My S3 Website Bucket's index.html RulesAmazon CloudFront 不遵守我的 S3 网站存储桶的 index.html 规则
【发布时间】:2013-02-24 21:21:24
【问题描述】:

我正在使用静态网站托管选项在 Amazon S3 上托管一个静态网站,这样 S3 将呈现一个文件夹,而无需让我明确指向我的 index.html 文件。

例如,这里是指向我的 S3 存储桶中页面的直接链接:http://new.rdegges.com.s3-website-us-east-1.amazonaws.com/category/2009/ 如您所见,当您访问该 URL 时,Amazon S3 会自动呈现该目录内的 index.html 文件,让我可以有干净的网址。

这一切都在 S3 上运行良好。我遇到的问题是让 Amazon Cloudfront 也能正确处理这种行为。当我创建一个 Cloudfront Distribution 并将我的 S3 存储桶指定为源并告诉它使用“index.html”作为根时,S3 的 index.html 行为刚刚停止工作。

例如,这是我在 Cloudfront 上的相同 URL:http://d1mj00c6pby3gc.cloudfront.net/category/2009/

不幸的是,上面的 URL 不起作用,但如果我手动指定索引文件,它会起作用,例如:http://d1mj00c6pby3gc.cloudfront.net/category/2009/index.html

我的问题是:我需要如何配置 Cloudfront 以使其尊重我网站的 S3 存储桶设置?

【问题讨论】:

  • 你绝对可以设置为root。不过,不确定它是否适用于每个目录。 aws.typepad.com/aws/2010/08/…
  • 嘿@dirn,是的!我正在使用 index.html 的默认根目录,但由于某种原因,它不适用于任何子文件夹(仅限顶级)。我觉得这很奇怪,因为 S3 具有相同的设置,并且它也适用于所有子文件夹,arg。
  • “不尊重”..哇!向我 +1 ????

标签: amazon-s3 amazon-cloudfront


【解决方案1】:

S3 网站功能可与 Amazon CloudFront 结合使用。但是,S3 网站使用与常规 S3 存储桶不同的域名。在这种情况下,您需要将 CloudFront 分配的原始配置的 Origin Domain Name 设置为 new.rdegges.com.s3-website-us-east-1.amazonaws.com

您可以从 S3 上的静态网站托管面板获取此 URL(端点):

一旦 CloudFront 指向 S3 网站域名,S3 网站功能应该可以工作。

【讨论】:

  • 很好的解决方案,谢谢。我敢打赌,很多人都会遇到这种情况,因为云端会自动完成存储桶名称,而不是静态网站 url。一开始我并不清楚区别。
  • 唯一的缺点是,如果您使用静态网站端点,则无法在 CloudFront 和 S3 之间使用 SSL。所以,SSL 或 index.html 处理:选择一个。
  • @AlexB 在添加 Origin 以使用“仅 HTTP”或“匹配查看器”时(现在)有一个选项。 “如果您为源协议策略选择匹配查看器,并且查看器使用 HTTPS 连接到 CloudFront,CloudFront 将使用 HTTPS 连接到您的源。”
  • +2 - 刚回来给你一个赞成票,因为这解决了我的问题 - 我已经给了你一个赞成票 - 上次发生在我身上。棘手的是 AWS 将 CloudFront 源自动完成到您的 S3 存储桶,但默认不是网站 URL,而是 S3 URL。您会认为 AWS 会知道 S3 存储桶已配置为网站,并相应地调整默认值。
  • @AlexB 仍然是这种情况 - 如果您的源域名是您的 S3 静态网站端点,您不能使用 Cloudfront SSL?
【解决方案2】:

我想在接受的答案中添加一些内容。

首先,确保您的云端有Default Root Object。如documentation 中所述,这不适用于subdirectories

在设置新的 cloudfront 分发时,它会让您选择您的存储桶bucket-name.s3.amazonaws.com。请注意,该区域未在 URL 中指定。您需要做的是从 s3 中获取静态站点 url 并将其用作origin url(该区域将在那里)。

【讨论】:

  • 我遇到了根对象没有给出默认 index.html 的问题。起初我尝试将它发送到 cname www.example.com 和 www.example.com/index.html 这不起作用,当我简单地将根对象设置为 index.html
  • 我必须将 CF 默认根对象设置为空白(未设置),然后将 s3 存储桶上的索引文档设置为 index.html
【解决方案3】:

这可能是游戏的后期,但请查看Lambda@Edge。您可以在没有扩展名的情况下拦截 Origin Requests 并将它们指向文件夹中的 index.html 文档。这些结果会被缓存,因此 Lambda 仅在收到新请求时才会执行。

【讨论】:

    猜你喜欢
    • 2019-05-27
    • 1970-01-01
    • 2016-11-24
    • 2023-03-26
    • 2023-03-05
    • 2018-01-25
    • 2017-10-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多