

# 指定默认根对象
<a name="DefaultRootObject"></a>

当用户（查看器）请求您的分配的根 URL 而不是请求分配中的对象时，您可配置 CloudFront 以返回特定的对象（默认根对象）。您可以使用默认根对象来避免公开分配的内容。

**Contents**
+ [

## 如何指定默认根对象
](#DefaultRootObjectHowToDefine)
+ [

## 原定设置根对象的工作原理
](#DefaultRootObjectHow)
+ [

## 未定义根对象的情况下 CloudFront 的工作方式
](#DefaultRootObjectNotSet)

## 如何指定默认根对象
<a name="DefaultRootObjectHowToDefine"></a>

要避免公开分配的内容或返回错误，请为您的分配指定默认根对象。您可以指定确切的文件名或该文件的路径。例如，如果您的根对象是 `index.html` 文件，则可以指定该文件的名称。如果您的 `index.html` 文件位于其他文件夹中，请改为指定路径，例如 `exampleFolderName/index.html`。如果您设置了指向默认根对象的路径，则查看器对分配的根 URL 发出的请求将返回该路径中的指定文件。使用文件路径，您可以在源位置更灵活地组织内容，因为您的默认根对象可能在文件夹中而不是根级别。<a name="DefaultRootObjectProcedure"></a>

**要为分配指定默认根对象**

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

   文件可为 CloudFront 支持的任何类型。有关文件名的约束条件列表，请参阅《Amazon CloudFront API Reference》**中 [DistributionConfig](https://docs.aws.amazon.com/cloudfront/latest/APIReference/API_DistributionConfig.html) 的 `DefaultRootObject` 元素。
**注意**  
如果默认根对象的文件名太长或包含无效字符，CloudFront 则返回错误 `HTTP 400 Bad Request - InvalidDefaultRootObject`。此外，CloudFront 将缓存代码 10 秒钟（默认情况下），并将结果写入访问日志。

1. 确认对象的权限至少向 CloudFront 授予了读取访问权限。

   有关 Amazon S3 权限的更多信息，请参阅 [Amazon Simple Storage Service 用户指南](https://docs.aws.amazon.com/AmazonS3/latest/userguide/s3-access-control.html)中的 *Amazon S3 中的标识和访问权限管理*。

1. 使用 CloudFront 控制台或 CloudFront API 更新分配，来引用默认根对象。

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

   1. 登录 AWS 管理控制台，并通过以下网址打开 CloudFront 控制台：[https://console.aws.amazon.com/cloudfront/v4/home](https://console.aws.amazon.com/cloudfront/v4/home)。

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

   1. 在**设置**窗格中的**常规**选项卡上，选择**编辑**。

   1. 在**编辑设置**对话框的**默认根对象**字段中，输入默认根对象的文件名或路径。
**提示**  
您的字符串不能以正斜杠（`/`）开头。请仅指定对象名称或对象的路径。例如，使用 `index.html` 或 `exampleFolderName/index.html`。指定 `/exampleFolderName/index.html` 或 `/index.html` 可能会导致 [403 访问被拒绝错误](http-403-permission-denied.md)。

   1. 选择**保存更改**。

   要使用 CloudFront API 更新您的分配，请在分配中为 `DefaultRootObject` 元素指定值。有关使用 CloudFront API 指定默认根对象的信息，请参阅 *Amazon CloudFront API 参考*中的 [UpdateDistribution](https://docs.aws.amazon.com/cloudfront/latest/APIReference/API_UpdateDistribution.html)。

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

   1. 通过在 CloudFront 控制台查看分配的状态，确认您的分配已经完全部署。

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

## 原定设置根对象的工作原理
<a name="DefaultRootObjectHow"></a>

假定以下请求指向对象 `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 不确定带有多个尾部斜杠的 URL（`https://d111111abcdef8.cloudfront.net///`）是否等同于 `https://d111111abcdef8.cloudfront.net/`。您的原始服务器进行该比较。

如果您定义原定设置根对象，最终用户对于分配的子目录的请求不返回该原定设置根对象。例如，假设 `index.html` 是您的默认根对象且 CloudFront 接收最终用户对 CloudFront 分配下的 `install` 目录的请求：

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

CloudFront 不会返回默认根对象，即使 `index.html` 的副本出现在 `install` 目录中。但是，如果您指定了默认根对象的*路径*（`install/index.html`），则对于最终用户针对 `install` 目录发送的请求，CloudFront 将返回默认根对象。

如果您将自己的分配配置为允许 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 上托管网站](https://docs.aws.amazon.com/AmazonS3/latest/userguide/WebsiteHosting.html)章节。

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

## 未定义根对象的情况下 CloudFront 的工作方式
<a name="DefaultRootObjectNotSet"></a>

如果您不定义默认根对象，对分配的根请求则传递到源服务器。如果您使用 Amazon S3 源，则可能返回以下任何内容：
+ **Amazon S3 存储桶的内容列表** – 在以下任何条件下，使用 CloudFront 访问分配的任何人均可看见源的内容：
  + 您的存储桶未正确配置。
  + 与分配有关的存储桶和存储桶中对象的 Amazon S3 权限授予*每个人*访问权。
  + 最终用户使用源的根 URL 访问您的源。
+ **源的私有内容列表** – 如果您配置您的源作为私有分配（仅您和 CloudFront 有访问权），具有凭证通过 CloudFront 访问您的分配的任何人可看见与您的分配有关的 Amazon S3 存储桶的内容。在这种情况下，用户不能通过源的根 URL 访问您的内容。更多有关分配私有内容的信息，请参阅 [使用签名 URL 和签名 Cookie 提供私有内容](PrivateContent.md)。
+ `Error 403 Forbidden` – 如果与分配有关的 Amazon S3 存储桶上的权限或该存储桶中对象上的权限拒绝 CloudFront 和每个人访问，CloudFront 则返回该错误。