

# 添加、删除或替换 CloudFront 分配的内容
<a name="AddRemoveReplaceObjects"></a>

此部分介绍了如何确保 CloudFront 能够访问要提供给查看器的内容，如何指定网站或应用程序中的对象以及如何删除或替换内容。

**Topics**
+ [

## 添加和访问 CloudFront 分配的内容
](#AddingObjects)
+ [

# 使用文件版本控制，通过 CloudFront 分配来更新或删除内容
](UpdatingExistingObjects.md)
+ [

# 在 CloudFront 中自定义文件的 URL 格式
](LinkFormat.md)
+ [

# 指定默认根对象
](DefaultRootObject.md)
+ [

# 使文件失效以删除内容
](Invalidation.md)
+ [

# 提供压缩文件
](ServingCompressedFiles.md)

## 添加和访问 CloudFront 分配的内容
<a name="AddingObjects"></a>

如果您希望 CloudFront 分配内容（对象），则可以将文件添加到为分配指定的源之一，然后公开指向这些文件的 CloudFront 链接。CloudFront 边缘站点不从源提取新文件，直至边缘站点收到了针对这些文件的查看器请求。有关更多信息，请参阅 [CloudFront 如何交付内容](HowCloudFrontWorks.md)。

在您添加希望 CloudFront 分配的文件时，请确保将其添加到您在分配中指定的 Amazon S3 存储桶之一，对于自定义源，将其添加到指定域中的目录。此外，确认适用缓存行为中的路径模式将请求发送到正确的源。

例如，假设缓存行为的路径模式是 `*.html`。如果您尚未配置任何其他缓存行为以将请求转发到源，则 CloudFront 仅转发 `*.html` 文件。在这种情况下，例如，CloudFront 绝不会分发您上传到源的 .jpg 文件，因为您尚未创建包括 .jpg 文件的缓存行为。

CloudFront 服务器不确定他们提供的对象的 MIME 类型。当您将一个文件上传到源时，建议您为该文件设置 `Content-Type` 标头字段。

# 使用文件版本控制，通过 CloudFront 分配来更新或删除内容
<a name="UpdatingExistingObjects"></a>

要更新设置为通过 CloudFront 分配给您的现有内容，建议您在文件名或文件夹名称中使用版本标识符。这有助于您更好地管理 CloudFront 提供的内容。

## 使用版本化文件名更新现有文件
<a name="ReplacingObjects"></a>

当您更新 CloudFront 分配中的现有文件时，建议您在文件名或目录名称中包括某种版本的标识符，以便更好地控制自己的内容。此标识符可能是日期时间戳、序列号、或区别同一对象的两种版本的其他方法。

例如，取代命名图像文件 image.jpg，您可称之为 image\$11.jpg。当您想开始提供新版本的文件时，您需要将新文件命名为 image\$12.jpg，并且更新 Web 应用程序或网站中的链接以指向 image\$12.jpg。此外，您可将所有的图形放在 image\$1v1 目录中，且当您想开始提供一个或多个图像的新版本时，您会创建新的 image\$1v2 目录，并且您会更新指向该目录的链接。凭借版本控制，您不必在 CloudFront 开始提供对象新版本之前等待期过期，并且您不必为对象的失效支付费用。

即使您对文件进行版本控制，我们仍建议您设置到期日期。有关更多信息，请参阅 [管理内容保留在缓存中的时间长度（过期）](Expiration.md)。

**注意**  
指定版本控制的文件名或目录名与 Amazon S3 对象版本控制无关。

## 删除内容，这样 CloudFront 不会再分发该内容
<a name="RemovingObjects"></a>

您可以从源中删除不再希望包含在 CloudFront 分配中的文件。但是，CloudFront 将继续为查看器显示边缘缓存中的内容，直至文件过期。

如果您要立即删除文件，您必须执行下列操作之一：
+ **使用文件版本控制。**当您使用版本控制时，不同版本的文件具有可在 CloudFront 分配中使用的不同名称，以便更改返回给查看器的文件。有关更多信息，请参阅 [使用版本化文件名更新现有文件](#ReplacingObjects)。
+ **使文件失效。**有关更多信息，请参阅 [使文件失效以删除内容](Invalidation.md)。

# 在 CloudFront 中自定义文件的 URL 格式
<a name="LinkFormat"></a>

在为源设置您希望 CloudFront 提供给查看器的对象（内容）后，您必须使用正确的 URL 在网站或应用程序代码中引用这些对象，以便 CloudFront 可以提供该对象。

您在网页或 Web 应用程序中的对象的 URL 中使用的域名可以是以下任一种：
+ CloudFront 在您创建分配时自动分配的域名，例如 `d111111abcdef8.cloudfront.net`
+ 您自己的域名，例如 `example.com`

例如，您可以使用以下 URL 之一来返回文件 `image.jpg`：

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

`https://example.com/images/image.jpg`

可使用相同的 URL 格式，无论您将内容存储在 Amazon S3 存储桶中还是自定义源中，如您自己的某台 Web 服务器。

**注意**  
URL 格式部分取决于您在分配中为**源路径**指定的值。此值为 CloudFront 提供了您的对象的顶级目录路径。有关在您创建分配时设置源路径的更多信息，请参阅[源路径](DownloadDistValuesOrigin.md#DownloadDistValuesOriginPath)。

有关 URL 格式的更多信息，请参阅下面几节。

## 使用您自己的域名（example.com）
<a name="LinkFormat_OwnDomain"></a>

您可以不使用在创建分配时 CloudFront 为您分配的默认域名，而是[添加更易于使用的备用域名](https://docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/distribution-web-values-specify.html#DownloadDistValuesCNAME)，例如 `example.com`。通过使用 CloudFront 设置您自己的域名，您可以对分配中的对象使用如下 URL：

`https://example.com/images/image.jpg`

如果您计划在查看器和 CloudFront 之间使用 HTTPS，请参阅[使用备用域名和 HTTPS](using-https-alternate-domain-names.md)。

## 在 URL 中使用尾随斜杠（/）
<a name="LinkFormat_TrailingSlash"></a>

在您为 CloudFront 分配中的目录指定 URL 时，选择始终使用尾随斜杠或从不使用尾随斜杠。例如，为您的所有 URL 仅选择以下格式之一：

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

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

**这为什么非常重要？**

这两种格式都可用于链接到 CloudFront 对象，但保持一致有助于防止您稍后要使目录失效时出现问题。CloudFront 完全按照 URL 定义的样子进行存储，包括尾随斜杠。因此，如果格式不一致，您将需要分别使带和不带斜杠的目录 URL 失效，以确保 CloudFront 删除该目录。

必须使两种 URL 格式无效很不方便，并且会引发额外成本。这是因为，如果您必须执行两次失效操作来涵盖两种类型的 URL，则您可能会超过当月的最大免费失效次数。如果出现这种情况，您将必须为所有失效付费，即使 CloudFront 中仅存在每个目录 URL 的一种格式也是如此。

## 为限制内容创建签名 URL
<a name="LinkFormat_SignedURLs"></a>

如果您要限制对您的内容的访问，可以创建签名 URL。例如，如果您希望将内容仅分发到经过身份验证的用户，则可以创建仅在指定时间段内有效或只能从指定 IP 地址使用的 URL。有关更多信息，请参阅 [使用签名 URL 和签名 Cookie 提供私有内容](PrivateContent.md)。

# 指定默认根对象
<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 则返回该错误。

# 使文件失效以删除内容
<a name="Invalidation"></a>

如果您需要在文件过期前从 CloudFront 边缘缓存中删除文件，可以执行下列操作之一：
+ 通过边缘缓存使文件失效。查看器下次请求文件时，CloudFront 将返回源以获取文件的最新版本。
+ 使用文件版本控制以提供具有不同名称的文件的不同版本。有关更多信息，请参阅 [使用版本化文件名更新现有文件](UpdatingExistingObjects.md#ReplacingObjects)。

**Topics**
+ [

## 在使文件失效和使用版本控制的文件名之间进行选择
](#Invalidation_Expiration)
+ [

# 确定使哪个文件失效
](invalidation-access-logs.md)
+ [

# 使文件失效时的需知事项
](invalidation-specifying-objects.md)
+ [

# 使文件失效
](Invalidation_Requests.md)
+ [

# 并发失效请求最大值
](InvalidationLimits.md)
+ [

# 支付文件失效费用
](PayingForInvalidation.md)

## 在使文件失效和使用版本控制的文件名之间进行选择
<a name="Invalidation_Expiration"></a>

要控制从分配提供的文件版本，您可使文件失效或使用版本控制文件名为其命名。如果您希望频繁地更新文件，出于以下原因，建议您主要使用文件版本控制：
+ 即使用户在本地或企业缓存代理中缓存了文件的版本，版本控制也使您能够控制为请求返回哪个文件。如果您使文件失效，用户看到的可能继续是旧版本直至它从这些缓存中过期。
+ CloudFront 访问日志包括文件的名称，因此，版本控制使分析文件变更的结果变得更加轻松。
+ 版本控制提供一种将不同版本的文件提供给不同用户的方式。
+ 版本控制简化了文件修订之间的向前和向后滚动。
+ 版本控制更便宜。您仍需为 CloudFront 支付费用以将文件的新版本传输到边缘站点，但不必为使文件失效支付费用。

有关文件版本控制的更多信息，请参阅[使用版本化文件名更新现有文件](UpdatingExistingObjects.md#ReplacingObjects)。

# 确定使哪个文件失效
<a name="invalidation-access-logs"></a>

如果您要使多个文件失效，例如某个目录中的所有文件或者名称以相同字符开头的所有文件，您可以在失效路径的结尾包含 `*` 通配符。有关使用 `*` 通配符的更多信息，请参阅 [Invalidation paths](invalidation-specifying-objects.md#invalidation-specifying-objects-paths)。

要使文件失效，您可以指定单独文件的路径或以 `*` 通配符结尾的路径，后者可能会应用到一个或多个文件，如以下示例中所示：
+ `/images/image1.jpg`
+ `/images/image*`
+ `/images/*`

如果您想使选定文件失效但用户不必访问源上的每个文件，可确定查看器从 CloudFront 请求了哪些文件并只使这些文件失效。要决定查看器已经请求的文件，请启用 CloudFront 访问日志记录。有关访问日志的更多信息，请参阅 [访问日志（标准日志）](AccessLogs.md)。

# 使文件失效时的需知事项
<a name="invalidation-specifying-objects"></a>

指定要使其失效的文件时，请参考以下信息：

**区分大小写**  
失效路径区分大小写。例如，`/images/image.jpg` 和 `/images/Image.jpg` 指定两个不同的文件。

**使用 Lambda 函数更改 URI**  
如果您的 CloudFront 分配在发生查看器请求事件时触发 Lambda 函数，并且该函数更改请求的文件的 URI，建议您使这两个 URI 失效，以便从 CloudFront 边缘缓存中删除该文件：  
+ 查看器请求中的 URI
+ 函数进行更改后的 URI

**Example 示例**  
假设您的 Lambda 函数将某个文件的 URI 从：  
`https://d111111abcdef8.cloudfront.net/index.html`  
更改为包含语言目录的 URI：  
`https://d111111abcdef8.cloudfront.net/en/index.html`  
要使该文件失效，您必须指定以下路径：  
+ `/index.html`
+ `/en/index.html`
有关更多信息，请参阅 [Invalidation paths](#invalidation-specifying-objects-paths)。

 **默认根对象**  
要使默认根对象（文件）失效，请以您为任何其他文件指定路径相同的方式指定路径。有关更多信息，请参阅 [原定设置根对象的工作原理](DefaultRootObject.md#DefaultRootObjectHow)。

 **转发 Cookie**  
如果您将 CloudFront 配置为将 Cookie 转发到您的源，CloudFront 边缘缓存可能会包含文件的多个版本。当您使文件失效之后，CloudFront 会使文件的所有缓存版本失效，不论其关联的 Cookie 如何。您无法根据关联的 Cookie 选择性地使一些版本失效，而使另一些版本不失效。有关更多信息，请参阅 [根据 Cookie 缓存内容](Cookies.md)。

 **转发标头**  
如果您将 CloudFront 配置为将标头列表转发到源并基于标头的值进行缓存，CloudFront 边缘缓存可能会包含文件的多个版本。当您使文件失效之后，CloudFront 会使文件的所有缓存版本失效，而不论标头值如何。您无法根据标头值选择性地使一些版本失效，而使另一些版本不失效。（如果您将 CloudFront 配置为将所有标头转发到源，则 CloudFront 不会缓存您的文件。） 有关更多信息，请参阅 [根据请求标头缓存内容](header-caching.md)。

 **转发查询字符串**  
如果您将 CloudFront 配置为将查询字符串转发到您的源，在使文件失效时，必须包括查询字符串，如下例中所示：  
+ `/images/image.jpg?parameter1=a`
+ `/images/image.jpg?parameter1=b`
如果客户端请求包括针对同一个文件的五个不同查询字符串，您可以使文件失效五次（每个查询字符串一次），或者您可以在失效路径中使用 \$1 通配符，如下例中所示：  
`/images/image.jpg*`  
有关在失效路径中使用通配符的更多信息，请参阅 [Invalidation paths](#invalidation-specifying-objects-paths)。  
有关查询字符串的更多信息，请参阅 [根据查询字符串参数缓存内容](QueryStringParameters.md)。  
要确定哪个查询字符串正在使用中，您可启用 CloudFront 日志记录。有关更多信息，请参阅 [访问日志（标准日志）](AccessLogs.md)。

**允许的最大值**  
有关允许的最大失效次数的信息，请参阅[并发失效请求最大值](InvalidationLimits.md)。

 **Microsoft Smooth Streaming 文件**  
为对应的缓存行为启用 Smooth Streaming 时，您不能使 Microsoft Smooth Streaming 格式的媒体文件失效。

 **路径中的非 ASCII 或不安全字符**  
如果路径包含非 ASCII 字符或 [RFC 1738](https://tools.ietf.org/html/rfc1738) 中定义的不安全字符，请对这些字符进行 URL 编码。切勿对路径中的任何其他字符进行 URL 编码，否则，CloudFront 将不会使已更新文件的旧版本失效。  
请勿在路径中使用 `~` 字符。CloudFront 不支持使用此字符来实施失效，无论它是否经过 URL 编码。

 **失效路径**  
路径是相对于分配的。例如，要使 `https://d111111abcdef8.cloudfront.net/images/image2.jpg` 处的对象失效，您可指定 `/images/image2.jpg`。  
在 [CloudFront 控制台](https://console.aws.amazon.com/cloudfront/v4/home)中，您可以省略路径中的前导斜杠，如下所示：`images/image2.jpg`。在直接使用 CloudFront API 时，失效路径必须以前导斜杠开头。
您还可以使用 `*` 通配符使多个文件同时失效。`*` 将替换 0 个或多个字符，必须是失效路径中最后的字符。  
要在失效中使用通配符（\$1），必须将通配符放在路径的末尾。在其它任何地方插入的星号（\$1）会被视为文本字符匹配，而不是通配符失效。
如果您使用 AWS Command Line Interface（AWS CLI）使文件失效，并且指定一个包含 `*` 通配符的路径，则必须使用引号（`"`）将路径引起来，例如 `"/*"`。  
路径的长度上限是 4000 个字符。  

**Example 示例：使路径失效**  
+ 使目录中的所有文件失效：

  `/`*directory-path*`/*`
+ 使目录、其所有子目录以及该目录和子目录中的所有文件失效：

  `/`*directory-path*`*`
+ 使具有相同名称但文件扩展名不同的所有文件失效 (例如 logo.jpg、logo.png 和 logo.gif)：

  `/`*directory-path*`/`*file-name*`.*`
+ 使目录中文件名以相同字符开头的所有文件失效 (例如 HLS 格式的视频的所有文件) 而不论扩展名如何：

  `/`*directory-path*`/`*initial-characters-in-file-name*`*`
+ 当您将 CloudFront 配置为基于查询字符串参数进行缓存并且希望使某个文件的所有版本失效时：

  `/`*directory-path*`/`*file-name*`.`*file-name-extension*`*`
+ 使分配中的所有文件失效：

  `/*`
有关使用 Lambda 函数更改 URI 时使文件失效的信息，请参阅[Changing the URI Using a Lambda Function](#invalidation-lambda-at-edge)。  
如果失效路径为目录且您对指定目录的方法尚未标准化 (带或不带尾部斜杠 /)，建议您使带和不带尾部斜杠的目录均失效，例如，`/images` 和 `/images/`。

**已签名的 URL**  
如果您正在使用签名 URL，可以通过在问号 (?) 前仅包括部分 URL 来使文件失效。

# 使文件失效
<a name="Invalidation_Requests"></a>

您可以使用 CloudFront 控制台来创建并运行失效、显示您先前提交的失效列表以及有关单个失效的详细信息。您还可复制现有的失效、编辑文件路径列表并运行已编辑的失效。您无法从列表中删除失效。

**Contents**
+ [

## 使文件失效
](#invalidating-objects-console)
+ [

## 复制、编辑和重新运行现有失效
](#invalidating-objects-copy-console)
+ [

## 取消失效
](#canceling-invalidations)
+ [

## 列出失效
](#listing-invalidations-console)
+ [

## 显示有关失效的信息
](#invalidation-details-console)

## 使文件失效
<a name="invalidating-objects-console"></a>

要使用 CloudFront 控制台使文件失效，请执行以下操作。

------
#### [ Console ]<a name="invalidating-objects-console-procedure"></a>

**使文件失效（控制台）**

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

1. 选择您想为其使文件失效的分配。

1. 选择**失效**选项卡。

1. 选择**创建失效**。

1. 对于您希望使其失效的文件，请在每行输入一个失效路径。有关指定失效路径的信息，请参阅 [使文件失效时的需知事项](invalidation-specifying-objects.md)。
**重要**  
请谨慎指定文件路径。在启动之后，您无法取消失效请求。

1. 选择**创建失效**。

------
#### [ CloudFront API ]

要了解如何使对象失效以及显示失效相关信息，请参阅《Amazon CloudFront API 参考》**中的以下主题：
+ [CreateInvalidation](https://docs.aws.amazon.com/cloudfront/latest/APIReference/API_CreateInvalidation.html) 
+ [ListInvalidations](https://docs.aws.amazon.com/cloudfront/latest/APIReference/API_ListInvalidations.html)
+ [GetInvalidation](https://docs.aws.amazon.com/cloudfront/latest/APIReference/API_GetInvalidation.html)

**注意**  
如果您使用 AWS Command Line Interface（AWS CLI）使文件失效，并且指定了一个包含 `*` 通配符的路径，则必须使用引号（`"`）将路径引起来，如以下所示：  

```
aws cloudfront create-invalidation --distribution-id distribution_ID --paths "/*"
```

------

## 复制、编辑和重新运行现有失效
<a name="invalidating-objects-copy-console"></a>

您可复制您先前创建的失效、更新失效路径列表以及运行已更新的失效。您不可复制现有失效、更新失效路径，然后在不运行已更新失效的情况下将其保存。

**重要**  
如果您复制仍在进行中的失效、更新失效路径列表，然后运行已更新的失效，则 CloudFront 不会停止或删除您复制的失效。如果任何失效路径出现在原本和副本中，CloudFront 将尝试使文件失效两次，且两次失效均计入到您每月免费失效的最大数目中。如果您已经达到了免费失效的最大数目，将会向您收取每个文件两次失效的费用。有关更多信息，请参阅 [并发失效请求最大值](InvalidationLimits.md)。<a name="invalidating-objects-copy-console-procedure"></a>

**复制、编辑及重新运行现有失效**

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

1. 选择包含要复制的失效的分配。

1. 选择**失效**选项卡。

1. 选择您想复制的失效。

   如果您不确定要复制哪个失效，可以选择某个失效，然后选择**查看详细信息**以显示该失效的详细信息。

1. 选择**复制到新项目**。

1. 更新失效路径列表 (如适用)。

1. 选择**创建失效**。

## 取消失效
<a name="canceling-invalidations"></a>

当您将失效请求提交到 CloudFront 时，CloudFront 会在几秒钟内将该请求转发到所有边缘站点，每个边缘站点将立即开始处理失效。因此，一旦提交失效便无法取消它。

## 列出失效
<a name="listing-invalidations-console"></a>

通过使用 CloudFront 控制台，您可显示您已为分配创建和运行的最后 100 个失效的列表。如果您想获得超过 100 个失效的列表，请执行 `ListInvalidations` API 操作。有关更多信息，请参阅《Amazon CloudFront API 参考》**中的 [ListInvalidations](https://docs.aws.amazon.com/cloudfront/latest/APIReference/API_ListInvalidations.html)。<a name="listing-invalidations-console-procedure"></a>

**列出失效**

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

1. 选择您要为其显示失效列表的分配。

1. 选择**失效**选项卡。

**注意**  
您无法从列表中删除失效。

## 显示有关失效的信息
<a name="invalidation-details-console"></a>

您可显示失效的详细信息，包括分配 ID、失效 ID、失效状态、创建失效的日期和时间以及完整的失效路径列表。<a name="invalidation-details-console-procedure"></a>

**显示有关失效的信息**

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

1. 选择包含您要为其显示详细信息的失效的分配。

1. 选择**失效**选项卡。

1. 选择适用的失效 ID 或选择失效 ID，然后选择**查看详细信息**。

# 并发失效请求最大值
<a name="InvalidationLimits"></a>

如果您想逐个让文件失效，则针对每个分配一次可以同时处理 3000 个文件的无效请求。一个无效请求可以支持最多 3000 个文件，或针对一个文件的 3000 个请求，或者合计不超过 3000 个文件的任何组合方式。例如，您可以提交 30 个失效请求，每个请求使 100 个文件失效。只要全部 30 个失效请求仍在进行中，您无法继续提交任何失效请求。如果超出最大值，CloudFront 将返回一条错误消息。

如果您使用 \$1 通配符，则一次最多可以提出 15 个无效路径请求。您一次可以为每个分配的最多 3000 个单独文件提出失效请求，而允许的通配符无效请求的最大值与个别使文件失效的最大值无关。

# 支付文件失效费用
<a name="PayingForInvalidation"></a>

您每月提交的前 1000 个失效路径免费；每月超过 1000 个之后，您须为每个失效路径支付费用。一个失效路径可以针对单个文件（如 `/images/logo.jpg`），也可针对多个文件（如 `/images/*`）。一个包括 `*` 通配符的路径计数为一个路径，即使该路径导致 CloudFront 使数千个文件失效。

每月 1000 个免费失效路径的最大值适用于您通过一个 AWS 账户创建的所有分配的失效路径总数。例如，如果您使用 AWS 账户 `john@example.com` 创建了三个分配，并在给定月份里为*每个分配*提交了 600 个失效路径（总共 1800 个失效路径），那么 AWS 将针对总无效路径与 1000 个免费限制之间的差值向您收费。在此示例中，AWS 将向您收取当月内 800 个失效路径的费用。

不论您要使之失效的文件的数量是多少（单个文件 (`/images/logo.jpg`) 或是与分配关联的所有文件 (`/*`)），提交失效路径的费用均相同。由于在失效请求中，您需要按路径付费，因此即使您将多个路径捆绑到一个请求中，出于计费目的，每个路径仍会单独计数。

有关失效定价的更多信息，请参阅 [Amazon CloudFront 定价](https://aws.amazon.com/cloudfront/pricing/)。有关失效路径的更多信息，请参阅 [Invalidation paths](invalidation-specifying-objects.md#invalidation-specifying-objects-paths)。

# 提供压缩文件
<a name="ServingCompressedFiles"></a>

在压缩请求的对象时，由于对象更小（在某些情况下，大小不到原件的四分之一），因此下载速度可能更快。更快的下载可能导致向查看器更快地呈现网页，尤其是对于 JavaScript 和 CSS 文件。此外，CloudFront 数据传输的费用基于提供的数据总量。提供压缩的对象可能比提供未压缩的对象更便宜。

**Topics**
+ [

## 配置 CloudFront 来压缩对象
](#compressed-content-cloudfront-configuring)
+ [

## CloudFront 压缩的工作原理
](#compressed-content-cloudfront-how-it-works)
+ [

## 压缩的条件
](#compressed-content-cloudfront-notes)
+ [

## CloudFront 压缩的文件类型
](#compressed-content-cloudfront-file-types)
+ [

## `ETag` 标头转换
](#compressed-content-cloudfront-etag-header)

## 配置 CloudFront 来压缩对象
<a name="compressed-content-cloudfront-configuring"></a>

要将 CloudFront 配置为压缩对象，请更新您要提供压缩对象的缓存行为。

**将 CloudFront 配置为压缩对象（控制台）**

1. 登录 [CloudFront 控制台](https://console.aws.amazon.com/cloudfront/v4/home)。

1. 选择您的分配，然后选择要编辑的**行为**。

1. 对于**自动压缩对象**设置，选择**是**。

1. 使用[缓存策略](controlling-the-cache-key.md)来指定缓存设置，并同时启用 **Gzip** 和 **Brotli** 压缩格式。

**备注**  
您必须使用[缓存策略](controlling-the-cache-key.md)，才能使用 Brotli 压缩。Brotli 不支持旧版缓存设置。
要使用 [CloudFormation](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cloudfront-distribution-cachebehavior.html) 或 [CloudFront](https://docs.aws.amazon.com/cloudfront/latest/APIReference/Welcome.html) API 启用压缩，请将 `Compress`、`EnableAcceptEncodingGzip`、`EnableAcceptEncodingBrotli` 参数设置为 `true`。

要了解 CloudFront 如何压缩对象，请参阅以下部分。

## CloudFront 压缩的工作原理
<a name="compressed-content-cloudfront-how-it-works"></a>

1. 查看器请求对象。查看器在请求中包含 `Accept-Encoding` HTTP 标头，标头值包含 `gzip`、`br` 或同时包含二者。这表示查看器支持压缩对象。当查看器同时支持 Gzip 和 Brotli 时，CloudFront 使用 Brotli。
**注意**  
Chrome 和 Firefox Web 浏览器仅在使用 HTTPS 发送请求时才支持 Brotli 压缩。它们不支持对 HTTP 请求使用 Brotli。

1. 在边缘站点，CloudFront 将检查缓存中有无所请求对象的压缩副本。

1. 根据压缩对象是否在缓存中，CloudFront 执行以下操作之一：
   + 如果压缩的对象已在缓存中，则 CloudFront 将该对象发送到查看器并跳过剩余步骤。
   + 如果压缩的对象不在缓存中，则 CloudFront 将请求转发到源。
**注意**  
如果缓存中已有对象的未压缩副本，CloudFront 可能会将其发送到查看器，而不将请求转发到源。例如，当 CloudFront [先前跳过了压缩](#compression-skipped)时，可能会发生这种情况。发生这种情况时，CloudFront 会缓存未压缩的对象并继续处理该对象，直到对象过期、移出或失效。

1. 如果源返回了压缩对象（通过 HTTP 响应中的 `Content-Encoding` 标头指示），CloudFront 将该压缩对象发送给查看器，将其添加到缓存中，并跳过剩余步骤。CloudFront 不会再次压缩对象。

1. 如果源将未压缩的对象返回到 CloudFront（HTTP 响应中无 `Content-Encoding` 标头），则 CloudFront 将确定对象是否可压缩。有关更多信息，请参阅 [压缩的条件](#compressed-content-cloudfront-notes)。

1. 如果对象可压缩，则 CloudFront 将压缩该对象，然后将其发送到查看器，之后将其添加到缓存中。

1. 如果有对同一对象的后续查看器请求，CloudFront 将返回第一个缓存版本。例如，如果查看器请求一个使用 Gzip 压缩的特定缓存对象，而查看器*接受* Gzip 格式，则对同一对象的后续请求将始终返回 Gzip 版本，即使查看器同时接受 Brotli 和 Gzip 也是如此。

某些自定义源也可以压缩对象。源也许能够压缩 CloudFront 未压缩的对象。有关更多信息，请参阅 [CloudFront 压缩的文件类型](#compressed-content-cloudfront-file-types)。

## 压缩的条件
<a name="compressed-content-cloudfront-notes"></a>

以下列表提供了有关 CloudFront 不压缩对象的场景的更多信息。

**请求使用 HTTP 1.0**  
如果对 CloudFront 的请求使用 HTTP 1.0，则 CloudFront 将移除 `Accept-Encoding` 标头，并且不会压缩响应中的对象。

**`Accept-Encoding` 请求标头**  
如果查看器请求中缺失 `Accept-Encoding` 标头，或者如果该标头未包含 `gzip` 或 `br` 作为值，则 CloudFront 不会压缩响应中的对象。如果 `Accept-Encoding` 标头包含其他值（例如 `deflate`），则 CloudFront 会先删除这些值，然后再将请求转发到源。  
当 CloudFront [配置为压缩对象](#compressed-content-cloudfront-configuring)时，它自动在缓存键中和源请求中包含 `Accept-Encoding` 标头。

**当您将 CloudFront 配置为压缩对象时，内容已被缓存**  
CloudFront 在从源获取对象时压缩对象。当您将 CloudFront 配置为压缩对象时，CloudFront 不会压缩已在边缘站点中缓存的对象。此外，如果边缘站点中的缓存对象过期，并且 CloudFront 将针对该对象的另一个请求转发到源，则当源返回 HTTP 状态代码 304 时，CloudFront 不会压缩该对象。这意味着边缘站点已有最新版本的对象。如果您希望 CloudFront 压缩已在边缘站点中缓存的对象，需要使这些对象失效。有关更多信息，请参阅[使文件失效以删除内容](Invalidation.md)。

**源已配置为压缩对象**  
如果将 CloudFront 配置为压缩对象，并且源也压缩对象，则源应包含 `Content-Encoding` 标头。此标头向 CloudFront 表明已压缩该对象。如果来自源的响应包含 `Content-Encoding` 标头，则无论标头的值如何，CloudFront 都不会压缩对象。CloudFront 将响应发送给查看器，并在边缘站点缓存对象。

**CloudFront 压缩的文件类型**  
有关完整列表，请参阅[CloudFront 压缩的文件类型](#compressed-content-cloudfront-file-types)。

**CloudFront 压缩的对象大小**  
CloudFront 压缩大小介于 1000 字节和 10000000 字节之间的对象。

**`Content-Length` 标头**  
源必须在响应中包含 `Content-Length` 标头，CloudFront 使用它来确定对象大小是否在 CloudFront 压缩的范围内。如果 `Content-Length` 标头缺失、包含无效值或包含超出 CloudFront 可压缩的大小范围的值，则 CloudFront 不会压缩该对象。有关 CloudFront 如何处理可能超过大小范围的大型对象的更多信息，请参阅 [CloudFront 如何处理对象的部分请求 (Range GET)。](RangeGETs.md)。

**响应的 HTTP 状态代码**  
CloudFront 仅在响应的 HTTP 状态代码为 `200`、`403` 或 `404` 时压缩对象。

**响应没有正文**  
当来自源的 HTTP 响应没有正文时，CloudFront 没有任何可以压缩的内容。

**`ETag` 标头**  
CloudFront 有时会在压缩对象时修改 HTTP 响应中的 `ETag` 标头。有关更多信息，请参阅 [`ETag` 标头转换](#compressed-content-cloudfront-etag-header)。

**CloudFront 跳过压缩**  
CloudFront 将尽最大努力压缩对象。在极少数情况下，当 CloudFront 遇到高流量负载时，CloudFront 会跳过压缩对象的过程。CloudFront 根据包括主机容量在内的各种因素做出此决定。如果 CloudFront 跳过对象的压缩，它会缓存未压缩的对象，并在该对象过期、被移出或失效之前继续将其提供给查看器。

## CloudFront 压缩的文件类型
<a name="compressed-content-cloudfront-file-types"></a>

如果您将 CloudFront 配置为压缩对象，则 CloudFront 仅压缩 `Content-Type` 响应标头中具有以下值之一的对象：
+ `application/dash+xml`
+ `application/eot`
+ `application/font`
+ `application/font-sfnt`
+ `application/javascript`
+ `application/json`
+ `application/opentype`
+ `application/otf`
+ `application/pdf`
+ `application/pkcs7-mime`
+ `application/protobuf`
+ `application/rss+xml`
+ `application/truetype`
+ `application/ttf`
+ `application/vnd.apple.mpegurl`
+ `application/vnd.mapbox-vector-tile`
+ `application/vnd.ms-fontobject`
+ `application/wasm`
+ `application/xhtml+xml`
+ `application/xml`
+ `application/x-font-opentype`
+ `application/x-font-truetype`
+ `application/x-font-ttf`
+ `application/x-httpd-cgi`
+ `application/x-javascript`
+ `application/x-mpegurl`
+ `application/x-opentype`
+ `application/x-otf`
+ `application/x-perl`
+ `application/x-ttf`
+ `font/eot`
+ `font/opentype`
+ `font/otf`
+ `font/ttf`
+ `image/svg+xml`
+ `text/css`
+ `text/csv`
+ `text/html`
+ `text/javascript`
+ `text/js`
+ `text/plain`
+ `text/richtext`
+ `text/tab-separated-values`
+ `text/xml`
+ `text/x-component`
+ `text/x-java-source`
+ `text/x-script`
+ `vnd.apple.mpegurl`

## `ETag` 标头转换
<a name="compressed-content-cloudfront-etag-header"></a>

当来自源的未压缩对象包含有效的强 `ETag` HTTP 标头并且 CloudFront 压缩该对象时，CloudFront 还会将强 `ETag` 标头值转换为弱 `ETag`，并将弱 `ETag` 值返回到查看器。查看器可以存储弱 `ETag` 值并使用它来发送带 `If-None-Match` HTTP 标头的条件请求。这允许查看器、CloudFront 和源将对象的压缩版本和未压缩版本视为语义等效，从而减少不必要的数据传输。

有效的强 `ETag` 标头值以双引号字符（`"`）开头和结尾。为了将强 `ETag` 值转换为弱值，CloudFront 会将字符 `W/` 添加到强 `ETag` 值的开头。

当来自源的对象包含弱 `ETag` 标头值（以字符 `W/` 开头的值）时，CloudFront 不会修改此值，并会在从源接收此值后将它返回到查看器。

当来自源的对象包含无效的 `ETag` 标头值（该值不以 `"` 或 `W/` 开头）时，CloudFront 会删除 `ETag` 标头，并将对象返回到查看器而不带 `ETag` 响应标头。

有关更多信息，请参阅 MDN Web 文档中的以下页面：
+ [指令](https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/ETag#Directives) （`ETag` HTTP 标头）
+ [弱验证](https://developer.mozilla.org/en-US/docs/Web/HTTP/Conditional_requests#Weak_validation)（HTTP 条件请求）
+ [If-None-Match HTTP 标头](https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/If-None-Match)