指定默认根对象 - Amazon CloudFront

本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。

指定默认根对象

您可以配置 CloudFront 为在用户请求分配的根 URL 而不是请求分配中的对象时返回特定对象(默认根对象)。通过指定一个默认根对象,您可以避免公开分配的内容。

如何指定默认根对象

要避免公开分配的内容或返回错误,请通过以下步骤来为您的分配指定默认根对象。

要为分配指定默认根对象
  1. 将默认根对象上传到分配指向的源。

    文件可为 CloudFront 支持的任何类型。有关文件名限制的列表,请参阅中对DefaultRootObject元素的描述DistributionConfig

    注意

    如果默认根对象的文件名太长或包含无效字符, CloudFront 则返回错误HTTP 400 Bad Request - InvalidDefaultRootObject。此外,将代码 CloudFront 缓存 10 秒(默认情况下),并将结果写入访问日志。

  2. 确认对象的权限 CloudFront 至少授予了read访问权限。

    有关 Amazon S3 权限的更多信息,请参阅 Amazon Simple Storage Service 用户指南 中的 Amazon S3 中的标识和访问权限管理

  3. 使用CloudFront 控制台或 CloudFront API 更新您的发行版以引用默认根对象。

    要使用 CloudFront 控制台指定默认根对象,请执行以下操作:

    1. 登录AWS Management Console并打开 CloudFront 控制台,网址为https://console.aws.amazon.com/cloudfront/v4/home

    2. 在顶部窗格中的分配列表里,选择要更新的分配。

    3. Settings(设置)窗格中的 General(常规)选项卡上,选择 Edit(编辑)。

    4. Edit settings(编辑设置)对话框的 Default root object(默认根对象)字段中,输入默认根对象的文件名。

      仅输入对象名称,例如 index.html。不要在对象名称前添加 /

    5. 选择 ‬保存更改

    要使用 CloudFront API 更新配置,您需要为分配中的DefaultRootObject元素指定一个值。有关使用 CloudFront API 指定默认根对象的信息,请参阅 Amazon CloudFront API 参考UpdateDistribution中的。

  4. 确认您已经通过请求根 URL 启用了默认根对象。如果您的浏览器不显示默认根对象,请执行以下步骤:

    1. 在 CloudFront 控制台中查看您的分配状态,确认您的发行版已完全部署。

    2. 重复第 2 步和第 3 步,确认您已授予正确的权限,并且您已正确地更新分配的配置来指定默认根对象。

原定设置根对象的工作原理

假定以下请求指向对象 image.jpg

https://d111111abcdef8.cloudfront.net/image.jpg

相反,以下请求指向相同分配的根 URL 而不是特定的对象,如第一个示例中所述:

https://d111111abcdef8.cloudfront.net/

当您定义默认根对象时,调用分配的根的最终用户请求返回默认根对象。例如,如果您指定文件 index.html 作为您的默认根对象,请求:

https://d111111abcdef8.cloudfront.net/

返回值:

https://d111111abcdef8.cloudfront.net/index.html

注意

CloudFront 无法确定带有多个尾部斜杠 (https://d111111abcdef8.cloudfront.net///) 的 URL 是否等同于。https://d111111abcdef8.cloudfront.net/您的原始服务器进行该比较。

如果您定义原定设置根对象,最终用户对于分配的子目录的请求不返回该原定设置根对象。例如,假设index.html这是您的默认根对象,它 CloudFront 接收了最终用户对您的 CloudFront发行版下install目录的请求:

https://d111111abcdef8.cloudfront.net/install/

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

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

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

重要

请记住,默认根对象仅适用于您的 CloudFront 分配。您仍需要管理源的安全。例如,如果您使用 Amazon S3 源,仍需要适当地设置您的 Amazon S3 存储桶 ACL,以确保您想要的存储桶访问级别。

如果你不定义根对象会如何 CloudFront 运作

如果您不定义默认根对象,对分配的根请求则传递到源服务器。如果您使用 Amazon S3 源,则可能返回以下任何内容:

  • 您的 Amazon S3 存储桶内容列表 — 在以下任一条件下,任何用于 CloudFront 访问您的分配的用户都可以看到您的源内容:

    • 您的存储桶未正确配置。

    • 与分配有关的存储桶和存储桶中对象的 Amazon S3 权限授予每个人访问权。

    • 最终用户使用源的根 URL 访问您的源。

  • 来源@@ 的私有内容列表 — 如果您将源配置为私有分发(只有您自己并且有权访问),那么任何 CloudFront 拥有访问您的分配的凭证的人都可以看到与您的分配关联的 Amazon S3 存储桶中的内容 CloudFront。在这种情况下,用户不能通过源的根 URL 访问您的内容。更多有关分配私有内容的信息,请参阅 使用签名 URL 和签名 Cookie 提供私有内容

  • Error 403 Forbidden— 如果与您的分配关联的 Amazon S3 存储桶上的权限或该存储桶中对象的权限拒绝所有人访问 CloudFront 和访问该存储桶,则CloudFront 返回此错误。