

# 使用策略来控制缓存键
<a name="controlling-the-cache-key"></a>

使用 CloudFront *缓存策略*，您可以为在 CloudFront 边缘站点中缓存的对象，指定 CloudFront 将包含在*缓存键*中的 HTTP 标头、Cookie 和查询字符串。缓存键是缓存中每个对象的唯一标识符，它决定查看器的 HTTP 请求是否导致*缓存命中*。

如果查看器请求生成与先前请求相同的缓存键，并且该缓存键的对象位于边缘站点的缓存中且有效，则会发生缓存命中。当存在缓存命中时，该对象将从 CloudFront 边缘站点提供给查看器，这具有以下好处：
+ 减少了源服务器上的负载
+ 缩短了查看器的延迟

缓存键中包含的值越少，缓存命中结果的可能性越高。这可以为您的网站和应用程序带来更好的性能，因为可以得到更高的*缓存命中率*（导致缓存命中的查看器请求的比率更高）。有关更多信息，请参阅 [了解缓存键](understanding-the-cache-key.md)。

要控制缓存键，请使用 CloudFront *缓存策略*。将缓存策略附加到 CloudFront 分配中的一个或多个缓存行为。

您还可以使用缓存策略为 CloudFront 缓存中的对象指定存活时间（TTL）设置，并允许 CloudFront 请求和缓存压缩对象。

**注意**  
缓存设置对 gRPC 请求没有影响，因为 gRPC 流量无法缓存。有关更多信息，请参阅 [将 gRPC 与 CloudFront 分配结合使用](distribution-using-grpc.md)。

**Topics**
+ [了解缓存策略](cache-key-understand-cache-policy.md)
+ [创建缓存策略](cache-key-create-cache-policy.md)
+ [使用托管式缓存策略](using-managed-cache-policies.md)
+ [了解缓存键](understanding-the-cache-key.md)

# 了解缓存策略
<a name="cache-key-understand-cache-policy"></a>

利用缓存策略，您可以通过控制缓存键中包含的值（URL 查询字符串、HTTP 标头和 Cookie）来提高缓存命中率。CloudFront 为常见使用案例提供了一些预定义的源请求策略（称为*托管策略*）。您可以使用这些托管策略，也可以创建特定于您的需求的缓存策略。有关托管策略的更多信息，请参阅[使用托管式缓存策略](using-managed-cache-policies.md)。

缓存策略包含以下设置，这些设置的分类如下：*策略信息*、*生存时间 (TTL) 设置*和*缓存键设置*。

## 策略信息
<a name="cache-key-understand-cache-policy-info"></a>

**名称**  
用于标识缓存策略的名称。在控制台中，可以使用名称将缓存策略附加到缓存行为。

**说明**  
用于描述缓存策略的注释。虽然此选项是可选的，但它可以帮助您确定缓存策略的用途。

## 生存时间 (TTL) 设置
<a name="cache-key-understand-cache-policy-ttl"></a>

将生存时间（TTL）设置与 `Cache-Control` 和 `Expires` HTTP 标头（如果它们在源响应中）配合使用，可以确定 CloudFront 缓存中的对象保持有效的时间。

**最小 TTL**  
您希望对象在 CloudFront 缓存中保留的最短时间（以秒为单位），在此时间之后，CloudFront 会向您的源转发另一个请求以确定此对象是否已更新。有关更多信息，请参阅 [管理内容保留在缓存中的时间长度（过期）](Expiration.md)。  
如果最小 TTL 大于 0，CloudFront 将至少在缓存策略的最小 TTL 中指定的持续时间内缓存内容，即使源标头中存在 `Cache-Control: no-cache`、`no-store` 或 `private` 指令也是如此。

**最大 TTL**  
在 CloudFront 向源发送另一个请求以查看对象是否已更新之前，对象在 CloudFront 缓存中保留的最大时间量（以秒为单位）。仅当源对象随对象发送 `Cache-Control` 或 `Expires` 标头时，CloudFront 才使用此设置。有关更多信息，请参阅 [管理内容保留在缓存中的时间长度（过期）](Expiration.md)。

**默认 TTL**  
您希望对象在 CloudFront 缓存中保留的默认时间（以秒为单位），在此时间之后，CloudFront 会向您的源转发另一个请求以确定此对象是否已更新。仅当源*不*随对象发送 `Cache-Control` 或 `Expires` 标头时，CloudFront 才使用此设置的值作为对象的 TTL。有关更多信息，请参阅 [管理内容保留在缓存中的时间长度（过期）](Expiration.md)。

**注意**  
如果**最小 TTL**、**最大 TTL** 和**默认 TTL** 设置都设置为 0，则会禁用 CloudFront 缓存。

## 缓存键设置
<a name="cache-key-understand-cache-policy-settings"></a>

缓存键设置指定 CloudFront 包含在缓存键中的查看器请求的值。这些值可以包括 URL 查询字符串、HTTP 标头和 Cookie。缓存键中包含的值将自动包含在 CloudFront 发送到源的请求（称为*源请求*）中。有关在不影响缓存键的情况下控制源请求的信息，请参阅[使用策略来控制源请求](controlling-origin-requests.md)。

缓存键设置包括：
+ [标头](#cache-policy-headers)
+ [Cookies](#cache-policy-cookies)
+ [查询字符串](#cache-policy-query-strings)
+ [压缩支持](#cache-policy-compressed-objects)

**标头**  
CloudFront 包含在缓存键和源请求中的查看器请求中的 HTTP 标头。对于标头，您可以选择下列设置之一：  
+ **无** – 查看器请求中的 HTTP 标头*不* 会包含在缓存键中，也*不* 会自动包含在源请求中。
+ **Include the following headers**（包含以下标头）– 您可以指定查看器请求中的哪些 HTTP 标头包含在缓存键中，并且会自动包含在源请求中。
在使用 **Include the following headers**（包含以下标头）设置时，可以按 HTTP 标头的名称（而不是值）指定它们。例如，请考虑以下 HTTP 标头：  

```
Accept-Language: en-US,en;q=0.5
```
在此情况下，您可以将标头指定为 `Accept-Language`，而不是指定为 `Accept-Language: en-US,en;q=0.5`。但是，CloudFront 会将完整标头（包括其值）包含在缓存键和源请求中。  
您还可以将 CloudFront 生成的某些标头包含在缓存键中。有关更多信息，请参阅 [添加 CloudFront 请求标头](adding-cloudfront-headers.md)。

**Cookies**  
CloudFront 包含在缓存键和源请求中的查看器请求中的 Cookie。对于 Cookie，您可以选择下列设置之一：  
+ **无** – 查看器请求中的 Cookie *不* 会包含在缓存键中，也*不* 会自动包含在源请求中。
+ **全部** – 查看器请求中的所有 Cookie 都包含在缓存键中，也会自动包含在源请求中。
+ **Include specified cookies**（包含指定 Cookie）– 您可以指定查看器请求中的哪些 Cookie 包含在缓存键中，并且会自动包含在源请求中。
+ **Include all cookies except**（包含全部 Cookie -例外项）– 您可以指定查看器请求中的哪些 Cookie *不* 包含在缓存键中，并且*不*会自动包含在源请求中。所有其他 Cookie（您指定的 Cookie 除外）*都* 包含在缓存键中，并且会自动包含在源请求中。
在使用 **Include specified cookies**（包含指定 Cookie）或 **Include all cookies except**（包含全部 Cookie -例外项）设置时，可以按 Cookie 的名称（而不是值）指定它们。例如，请考虑以下 `Cookie` 标头：  

```
Cookie: session_ID=abcd1234
```
在此情况下，您可以将 Cookie 指定为 `session_ID`，而不是指定为 `session_ID=abcd1234`。但是，CloudFront 会将完整 Cookie（包括其值）包含在缓存键和源请求中。

**查询字符串**  
CloudFront 包含在缓存键和源请求中的查看器请求中的 URL 查询字符串。对于查询字符串，可以选择下列设置之一：  
+ **无** – 查看器请求中的查询字符串*不* 会包含在缓存键中，也*不* 会自动包含在源请求中。
+ **全部** – 查看器请求中的所有查询字符串都包含在缓存键中，并且也会自动包含在源请求中。
+ **Include specified query strings**（包含指定查询字符串）– 您可以指定查看器请求中的哪些查询字符串包含在缓存键中，并且会自动包含在源请求中。
+ **Include all query strings except**（包含全部查询字符串-例外项）– 您可以指定查看器请求中的哪些查询字符串*不* 包含在缓存键中，并且*不* 会自动包含在源请求中。所有其他查询字符串（您指定的查询字符串除外）*都* 包含在缓存键中，并且会自动包含在源请求中。
在使用 **Include specified query strings**（包含指定查询字符串）或 **Include all query strings except**（包含全部查询字符串-例外项）设置时，可以按查询字符串的名称（而不是值）指定它们。例如，请考虑以下 URL 路径：  

```
/content/stories/example-story.html?split-pages=false
```
在此情况下，您可以将查询字符串指定为 `split-pages`，而不是指定为 `split-pages=false`。但是，CloudFront 会将完整的查询字符串（包括其值）包含在缓存键和源请求中。  
对于缓存密钥设置，CloudFront 将标头、查询字符串和 Cookie 的星号字符 (`*`) 视为文本字符串，而不是通配符。

**压缩支持**  
利用这些设置，CloudFront 可以在查看器支持 Gzip 或 Brotli 压缩格式时，请求和缓存以该压缩格式压缩的对象。这些设置还允许 [CloudFront 压缩](ServingCompressedFiles.md)功能发挥作用。查看器通过 `Accept-Encoding` HTTP 标头表示它们支持这些压缩格式。  
Chrome 和 Firefox Web 浏览器仅在使用 HTTPS 发送请求时支持 Brotli 压缩。这些浏览器不支持带 HTTP 请求的 Brotli。
在满足以下任一条件时，启用这些设置：  
+ 当查看器支持 Gzip 压缩对象时，您的源将返回这些对象（请求包含带 `gzip` 的 `Accept-Encoding` HTTP 标头作为值）。在此情况下，使用**启用了 Gzip** 设置（在 CloudFront API、AWS 开发工具包、AWS CLI 或 CloudFormation 中将 `EnableAcceptEncodingGzip` 设置为 `true`）。
+ 当查看器支持 Brotli 压缩对象时，您的源将返回这些对象（请求包含带 `br` 的 `Accept-Encoding` HTTP 标头作为值）。在此情况下，使用**启用了 Brotli** 设置（在 CloudFront API、AWS 开发工具包、AWS CLI 或 CloudFormation 中将 `EnableAcceptEncodingBrotli` 设置为 `true`）。
+ 此缓存策略附加到的缓存行为将通过 [CloudFront 压缩](ServingCompressedFiles.md)进行配置。在此情况下，可以为 Gzip 和/或 Brotli 启用缓存。启用 CloudFront 压缩后，为两种格式启用缓存可帮助降低将数据传输到 Internet 的成本。
如果为其中一种或两种压缩格式启用缓存，则不要在与相同缓存行为关联的[源请求策略](controlling-origin-requests.md)中包含 `Accept-Encoding` 标头。当为这些格式中的任一格式启用缓存时，CloudFront 始终在源请求中包含此标头，因此在源请求策略中包含 `Accept-Encoding` 不起作用。
如果源服务器未返回 Gzip 或 Brotli 压缩对象，或者缓存行为未通 CloudFront 压缩进行配置，则不要为压缩对象启用缓存。如果这样做的话，可能会导致[缓存命中率](cache-hit-ratio.md)下降。  
下面说明了这些设置如何影响 CloudFront 分配。以下所有方案都假定查看器请求包含 `Accept-Encoding` 标头。如果查看器请求不包含 `Accept-Encoding` 标头，则 CloudFront 不会将此标头包含在缓存键和相应的源请求中。    
**在为两种压缩格式支持缓存压缩对象的情况下**  
如果查看器同时支持 Gzip 和 Brotli，即，如果 `gzip` 和 `br` 值都在查看器请求中的 `Accept-Encoding` 标头中，CloudFront 将执行以下操作：  
+ 将标头标准化为 `Accept-Encoding: br,gzip` 并将标准化的标头包含在缓存键中。缓存键不包含查看器发送的 `Accept-Encoding` 标头中的其他值。
+ 如果边缘站点在缓存中具有与请求匹配的 Brotli 或 Gzip 压缩对象，并且未过期，则边缘站点会将此对象返回给查看器。
+ 如果边缘站点在缓存中没有与请求匹配的 Brotli 或 Gzip 压缩对象，并且未过期，则 CloudFront 会将标准化的标头（`Accept-Encoding: br,gzip`）包含在相应的源请求中。源请求不包含查看器发送的 `Accept-Encoding` 标头中的其他值。
如果查看器支持一种压缩格式，而不支持另一种压缩格式例如，如果 `gzip` 是查看器请求中 `Accept-Encoding` 标头中的值，而 `br` 不是，则 CloudFront 将执行以下操作：  
+ 将标头标准化为 `Accept-Encoding: gzip` 并将标准化的标头包含在缓存键中。缓存键不包含查看器发送的 `Accept-Encoding` 标头中的其他值。
+ 如果边缘站点在缓存中具有与请求匹配的 Gzip 压缩对象，并且未过期，则边缘站点会将此对象返回给查看器。
+ 如果边缘站点在缓存中没有与请求匹配的 Gzip 压缩对象，并且未过期，则 CloudFront 会将标准化的标头（`Accept-Encoding: gzip`）包含在相应的源请求中。源请求不包含查看器发送的 `Accept-Encoding` 标头中的其他值。
要了解当查看器支持 Brotli 而非 Gzip 时，CloudFront 将执行的操作，请在前面示例中将两种压缩格式相互替换。  
如果查看器不支持 Brotli 或 Gzip，即，查看器请求中的 `Accept-Encoding` 标头不包含 `br` 或 `gzip` 作为值，则 CloudFront：  
+ 不会将 `Accept-Encoding` 标头包含在缓存键中。
+ 将 `Accept-Encoding: identity` 包含在相应的源请求中。源请求不包含查看器发送的 `Accept-Encoding` 标头中的其他值。  
**在为一种压缩格式（而非另一种压缩格式）支持缓存压缩对象的情况下**  
例如，如果查看器支持已启用缓存的格式，例如，为 Gzip 启用缓存压缩对象并且查看器支持 Gzip（`gzip` 是查看器请求中 `Accept-Encoding` 标头中的值之一），CloudFront 将执行以下操作：  
+ 将标头标准化为 `Accept-Encoding: gzip` 并将标准化的标头包含在缓存键中。
+ 如果边缘站点在缓存中具有与请求匹配的 Gzip 压缩对象，并且未过期，则边缘站点会将此对象返回给查看器。
+ 如果边缘站点在缓存中没有与请求匹配的 Gzip 压缩对象，并且未过期，则 CloudFront 会将标准化的标头（`Accept-Encoding: gzip`）包含在相应的源请求中。源请求不包含查看器发送的 `Accept-Encoding` 标头中的其他值。
当查看器同时支持 Gzip 和 Brotli（查看器请求中的 `Accept-Encoding` 标头包含 `gzip` *和* `br` 作为值）时，此行为是相同的，因为在这种情况下，不支持为 Brotli 缓存压缩对象。  
要了解当为 Brotli 而非 Gzip 支持缓存压缩对象时，CloudFront 将执行的操作，请在前面示例中将两种压缩格式相互替换。  
如果查看器不支持已启用缓存的压缩格式（查看器请求中的 `Accept-Encoding` 标头不包含该格式的值），则 CloudFront：  
+ 不会将 `Accept-Encoding` 标头包含在缓存键中。
+ 将 `Accept-Encoding: identity` 包含在相应的源请求中。源请求不包含查看器发送的 `Accept-Encoding` 标头中的其他值。  
**在不支持为两种压缩格式缓存压缩对象的情况下**  
在不支持为两种压缩格式缓存压缩对象时，CloudFront 会像处理查看器请求中的任何其他 HTTP 标头一样处理 `Accept-Encoding` 标头。默认情况下，它不包括在缓存键中，也不包括在源请求中。与任何其他 HTTP 标头一样，可以将此标头包含在缓存策略或源请求策略中的标头列表中。

# 创建缓存策略
<a name="cache-key-create-cache-policy"></a>

利用缓存策略，您可以通过控制缓存键中包含的值（URL 查询字符串、HTTP 标头和 Cookie）来提高缓存命中率。您可以使用 AWS Command Line Interface（AWS CLI）或 CloudFront API 在 CloudFront 控制台中创建缓存策略。

创建缓存策略后，将它附加到 CloudFront 分配中的一个或多个缓存行为。

------
#### [ Console ]

**创建缓存策略（控制台）**

1. 登录到 AWS 管理控制台 并通过以下网址在 CloudFront 控制台中打开 **Policies (策略)** 页面：[https://console.aws.amazon.com/cloudfront/v4/home?#/policies](https://console.aws.amazon.com/cloudfront/v4/home?#/policies)。

1. 选择**创建缓存策略**。

1. 为此缓存策略选择所需的设置。有关更多信息，请参阅 [了解缓存策略](cache-key-understand-cache-policy.md)。

1. 完成后，选择 **Create**（创建）。

创建缓存策略后，可以将它附加到缓存行为。

**将缓存策略附加到现有分配（控制台）**

1. 在 CloudFront 控制台中打开 **Distributions (分配)** 页面，网址为 [https://console.aws.amazon.com/cloudfront/v4/home#/distributions](https://console.aws.amazon.com/cloudfront/v4/home#/distributions)。

1. 选择要更新的分配，然后选择**行为**选项卡。

1. 选择要更新的缓存行为，然后选择**编辑**。

   或者，要创建新的缓存行为，请选择 **Create behavior**(创建行为)。

1. 在 **Cache key and origin requests**（缓存键和源请求）区域，请确保选择了 **Cache policy and origin request policy**（缓存策略和源请求策略）。

1. 对于 **Cache policy**（缓存策略），选择要附加到此缓存行为的缓存策略。

1. 在页面底部，选择 **Save changes**（保存更改）。

**将缓存策略附加到新分配（控制台）**

1. 通过 打开 CloudFront 控制台[https://console.aws.amazon.com/cloudfront/v4/home](https://console.aws.amazon.com/cloudfront/v4/home)

1. 选择 **Create distribution**（创建分配）。

1. 在 **Cache key and origin requests**（缓存键和源请求）区域，请确保选择了 **Cache policy and origin request policy**（缓存策略和源请求策略）。

1. 对于 **Cache policy**（缓存策略），选择要附加到此分发的原定设置缓存行为的缓存策略。

1. 为源、原定设置缓存行为和其他分配设置选择所需的设置。有关更多信息，请参阅 [所有分配设置参考](distribution-web-values-specify.md)。

1. 完成后，选择 **Create distribution**（创建分配）。

------
#### [ CLI ]

要使用 AWS Command Line Interface (AWS CLI) 创建缓存策略，请使用 **aws cloudfront create-cache-policy** 命令。您可以使用输入文件来提供命令的输入参数，而不是将每个单独的参数指定为命令行输入。

**创建缓存策略（带输入文件的 CLI）**

1. 使用以下命令创建名为 `cache-policy.yaml` 的文件，其中包含 **create-cache-policy** 命令的所有输入参数。

   ```
   aws cloudfront create-cache-policy --generate-cli-skeleton yaml-input > cache-policy.yaml
   ```

1. 打开刚创建的名为 `cache-policy.yaml` 的文件。编辑该文件以指定所需的缓存策略设置，然后保存该文件。您可以从该文件中删除可选字段，但不要删除必填字段。

   有关缓存策略设置的更多信息，请参阅[了解缓存策略](cache-key-understand-cache-policy.md)。

1. 使用以下命令通过 `cache-policy.yaml` 文件中的输入参数创建缓存策略。

   ```
   aws cloudfront create-cache-policy --cli-input-yaml file://cache-policy.yaml
   ```

   记下命令输出中的 `Id` 值。这是缓存策略 ID，您需要它才能将缓存策略附加到 CloudFront 分配的缓存行为。

**将缓存策略附加到现有分配（带输入文件的 CLI）**

1. 使用以下命令保存要更新的 CloudFront 分配的分配配置。将 *distribution\$1ID* 替换为分配的 ID。

   ```
   aws cloudfront get-distribution-config --id distribution_ID --output yaml > dist-config.yaml
   ```

1. 打开刚创建的名为 `dist-config.yaml` 的文件。编辑该文件，对要更新的每个缓存行为进行以下更改以使用缓存策略。
   + 在缓存行为中，添加名为 `CachePolicyId` 的字段。对于字段的值，请使用创建策略后记下的缓存策略 ID。
   + 从缓存行为中删除 `MinTTL`、`MaxTTL`、`DefaultTTL` 和 `ForwardedValues` 字段。这些设置是在缓存策略中指定的，因此不能将这些字段和一个缓存策略包含在相同的缓存行为中。
   + 将 `ETag` 字段重命名为 `IfMatch`，但不更改字段的值。

   完成后保存该文件。

1. 使用以下命令更新分配以使用缓存策略。将 *distribution\$1ID* 替换为分配的 ID。

   ```
   aws cloudfront update-distribution --id distribution_ID --cli-input-yaml file://dist-config.yaml
   ```

**将缓存策略附加到新分配（带输入文件的 CLI）**

1. 使用以下命令创建名为 `distribution.yaml` 的文件，其中包含 **create-distribution** 命令的所有输入参数。

   ```
   aws cloudfront create-distribution --generate-cli-skeleton yaml-input > distribution.yaml
   ```

1. 打开刚创建的名为 `distribution.yaml` 的文件。在默认缓存行为中，在 `CachePolicyId` 字段中输入创建策略后记下的缓存策略 ID。继续编辑该文件以指定所需的分配设置，然后在完成后保存该文件。

   有关分配设置的更多信息，请参阅[所有分配设置参考](distribution-web-values-specify.md)。

1. 使用以下命令通过 `distribution.yaml` 文件中的输入参数创建分配。

   ```
   aws cloudfront create-distribution --cli-input-yaml file://distribution.yaml
   ```

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

要使用 CloudFront API 创建缓存策略，请使用 [CreateCachePolicy](https://docs.aws.amazon.com/cloudfront/latest/APIReference/API_CreateCachePolicy.html)。有关您在此 API 调用中指定的字段的更多信息，请参阅[了解缓存策略](cache-key-understand-cache-policy.md)以及有关 AWS SDK 或其他 API 客户端的 API 参考文档。

创建缓存策略后，可以使用下列 API 调用之一将该缓存策略附加到缓存行为：
+ 要将该配置附加到现有分配中的缓存行为，请使用 [UpdateDistribution](https://docs.aws.amazon.com/cloudfront/latest/APIReference/API_UpdateDistribution.html)。
+ 要将该配置附加到新分配中的缓存行为，请使用 [CreateDistribution](https://docs.aws.amazon.com/cloudfront/latest/APIReference/API_CreateDistribution.html)。

对于这两个 API 调用，请在缓存行为中的 `CachePolicyId` 字段中提供缓存策略的 ID。有关您在这些 API 调用中指定的其他字段的更多信息，请参阅 [所有分配设置参考](distribution-web-values-specify.md) 以及有关 AWS SDK 或其他 API 客户端的 API 参考文档。

------

# 使用托管式缓存策略
<a name="using-managed-cache-policies"></a>

CloudFront 提供了一组托管缓存策略，您可以将这些策略附加到分配的任意缓存行为。有了托管缓存策略，您无需编写或维护自己的缓存策略。托管策略使用已针对特定使用案例优化的设置。

要使用托管缓存策略，请将它附加到分配中的缓存行为。此过程与创建缓存策略时的过程相同，只不过您只需附加一个托管缓存策略，而不是创建新的缓存策略。您可以按名称（使用控制台）或 ID（使用 AWS CLI 或开发工具包）附加策略。以下部分列出了名称和 ID。

有关更多信息，请参阅 [创建缓存策略](cache-key-create-cache-policy.md)。

下面的主题介绍了您可以使用的托管缓存策略。

**Topics**
+ [Amplify](#managed-cache-policy-amplify)
+ [CachingDisabled](#managed-cache-policy-caching-disabled)
+ [CachingOptimized](#managed-cache-caching-optimized)
+ [CachingOptimizedForUncompressedObjects](#managed-cache-caching-optimized-uncompressed)
+ [Elemental-MediaPackage](#managed-cache-policy-mediapackage)
+ [UseOriginCacheControlHeaders](#managed-cache-policy-origin-cache-headers)
+ [UseOriginCacheControlHeaders-QueryStrings](#managed-cache-policy-origin-cache-headers-query-strings)

## Amplify
<a name="managed-cache-policy-amplify"></a>

[在 CloudFront 控制台中查看此策略](https://console.aws.amazon.com/cloudfront/v4/home#/policies/cache/2e54312d-136d-493c-8eb9-b001f22f67d2)

此策略适合用于作为 [AWS Amplify](https://aws.amazon.com/amplify/) Web 应用程序的源。

在使用 CloudFormation、AWS CLI 或 CloudFront API 时，此策略的 ID 为：

`2e54312d-136d-493c-8eb9-b001f22f67d2`

此策略包含以下设置：
+ **最小 TTL：**2 秒
+ **最大 TTL：**600 秒（10 分钟）
+ **原定设置 TTL：**2 秒
+ **缓存键中包含的标头：**
  + `Authorization`
  + `CloudFront-Viewer-Country`
  + `Host`

  还包含标准化的 `Accept-Encoding` 标头，因为已启用缓存压缩对象设置。有关更多信息，请参阅[压缩支持](cache-key-understand-cache-policy.md#cache-policy-compressed-objects)。
+ **缓存键中包含的 Cookie：**包含所有 Cookie。
+ **缓存键中包含的查询字符串：**包含所有查询字符串。
+ **缓存压缩对象设置：**已启用。有关更多信息，请参阅[压缩支持](cache-key-understand-cache-policy.md#cache-policy-compressed-objects)。

**警告**  
因为此策略的最小 TTL 大于 0，所以 CloudFront 会将内容缓存至少达到在缓存策略的最小 TTL 中指定的持续时间，即使源标头中存在 `Cache-Control: no-cache`、`no-store` 或 `private` 指令也不例外。

### AWS Amplify Hosting 缓存策略
<a name="additional-amplify-policies"></a>

Amplify 使用以下托管式缓存策略来优化客户应用程序的默认缓存配置：
+ [Amplify-Default](https://console.aws.amazon.com/cloudfront/v4/home#/policies/cache/4d1d2f1d-3a71-49ad-9e08-7ea5d843a556)
+ [Amplify-DefaultNoCookies](https://console.aws.amazon.com/cloudfront/v4/home#/policies/cache/a6bad946-36c3-4c33-aa98-362c74a7fb13)
+ [Amplify-ImageOptimization](https://console.aws.amazon.com/cloudfront/v4/home#/policies/cache/1c6db51a-a33f-469a-8245-dae26771f530)
+ [Amplify-StaticContent](https://console.aws.amazon.com/cloudfront/v4/home#/policies/cache/7e5fad67-ee98-4ad0-b05a-394999eefc1a)

**注意**  
这些策略仅由 Amplify 使用。我们建议您不要为分配使用这些策略。

有关管理 Amplify 托管应用程序的缓存配置的更多信息，请参阅《Amplify Hosting 用户指南》**中的 [Managing cache configuration](https://docs.aws.amazon.com/amplify/latest/userguide/caching.html)。

## CachingDisabled
<a name="managed-cache-policy-caching-disabled"></a>

[在 CloudFront 控制台中查看此策略](https://console.aws.amazon.com/cloudfront/v4/home#/policies/cache/4135ea2d-6df8-44a3-9df3-4b5a84be39ad)

此策略禁用缓存。此策略对于动态内容和不可缓存的请求很有用。

在使用 CloudFormation、AWS CLI 或 CloudFront API 时，此策略的 ID 为：

`4135ea2d-6df8-44a3-9df3-4b5a84be39ad`

此策略包含以下设置：
+ **最小 TTL：**0 秒
+ **最大 TTL：**0 秒
+ **原定设置 TTL：**0 秒
+ **缓存键中包含的标头：**无
+ **缓存键中包含的 Cookie：**无
+ **缓存键中包含的查询字符串：**无
+ **缓存压缩对象设置：**已禁用

## CachingOptimized
<a name="managed-cache-caching-optimized"></a>

[在 CloudFront 控制台中查看此策略](https://console.aws.amazon.com/cloudfront/v4/home#/policies/cache/658327ea-f89d-4fab-a63d-7e88639e58f6)

此策略旨在通过最大程度地减少 CloudFront 在缓存键中包含的值来提高缓存效率。CloudFront 不在缓存键中包含任何查询字符串或 Cookie，并且只包含标准化 `Accept-Encoding` 标头。这使 CloudFront 能够在源返回对象或在启用 [CloudFront 边缘压缩](ServingCompressedFiles.md)时以 Gzip 和 Brotli 压缩格式分别缓存对象。

在使用 CloudFormation、AWS CLI 或 CloudFront API 时，此策略的 ID 为：

`658327ea-f89d-4fab-a63d-7e88639e58f6`

此策略包含以下设置：
+ **最小 TTL：**1 秒。
+ **最大 TTL：**31536000 秒（365 天）。
+ **原定设置 TTL：**86400 秒（24 小时）。
+ **缓存键中包含的标头：**未明确包含任何标头。包含标准化的 `Accept-Encoding` 标头，因为已启用缓存压缩对象设置。有关更多信息，请参阅[压缩支持](cache-key-understand-cache-policy.md#cache-policy-compressed-objects)。
+ **缓存键中包含的 Cookie：**无。
+ **缓存键中包含的查询字符串：**无。
+ **缓存压缩对象设置：**已启用。有关更多信息，请参阅[压缩支持](cache-key-understand-cache-policy.md#cache-policy-compressed-objects)。

**警告**  
因为此策略的最小 TTL 大于 0，所以 CloudFront 会将内容缓存至少达到在缓存策略的最小 TTL 中指定的持续时间，即使源标头中存在 `Cache-Control: no-cache`、`no-store` 或 `private` 指令也不例外。

## CachingOptimizedForUncompressedObjects
<a name="managed-cache-caching-optimized-uncompressed"></a>

[在 CloudFront 控制台中查看此策略](https://console.aws.amazon.com/cloudfront/v4/home#/policies/cache/b2884449-e4de-46a7-ac36-70bc7f1ddd6d)

此策略旨在通过最大程度地减少缓存键中包含的值来提高缓存效率。不包括查询字符串、标头或 Cookie。此策略与前一个策略相同，但它禁用了缓存压缩对象设置。

在使用 CloudFormation、AWS CLI 或 CloudFront API 时，此策略的 ID 为：

`b2884449-e4de-46a7-ac36-70bc7f1ddd6d`

此策略包含以下设置：
+ **最小 TTL：**1 秒
+ **最大 TTL：**31536000 秒（365 天）
+ **原定设置 TTL：**86400 秒（24 小时）
+ **缓存键中包含的标头：**无
+ **缓存键中包含的 Cookie：**无
+ **缓存键中包含的查询字符串：**无
+ **缓存压缩对象设置：**已禁用

**警告**  
因为此策略的最小 TTL 大于 0，所以 CloudFront 会将内容缓存至少达到在缓存策略的最小 TTL 中指定的持续时间，即使源标头中存在 `Cache-Control: no-cache`、`no-store` 或 `private` 指令也不例外。

## Elemental-MediaPackage
<a name="managed-cache-policy-mediapackage"></a>

[在 CloudFront 控制台中查看此策略](https://console.aws.amazon.com/cloudfront/v4/home#/policies/cache/08627262-05a9-4f76-9ded-b50ca2e3a84f)

此策略旨在用于作为 AWS Elemental MediaPackage 终端节点的源。

在使用 CloudFormation、AWS CLI 或 CloudFront API 时，此策略的 ID 为：

`08627262-05a9-4f76-9ded-b50ca2e3a84f`

此策略包含以下设置：
+ **最小 TTL：**0 秒
+ **最大 TTL：**31536000 秒（365 天）
+ **原定设置 TTL：**86400 秒（24 小时）
+ **缓存键中包含的标头：**
  + `Origin`

  还包含标准化的 `Accept-Encoding` 标头，因为已经为 Gzip 启用了缓存压缩对象设置。有关更多信息，请参阅[压缩支持](cache-key-understand-cache-policy.md#cache-policy-compressed-objects)。
+ **缓存键中包含的 Cookie：**无
+ **缓存键中包含的查询字符串：**
  + `aws.manifestfilter`
  + `start`
  + `end`
  + `m`
+ **缓存压缩对象设置：**已对 Gzip 启用。有关更多信息，请参阅[压缩支持](cache-key-understand-cache-policy.md#cache-policy-compressed-objects)。

## UseOriginCacheControlHeaders
<a name="managed-cache-policy-origin-cache-headers"></a>

[在 CloudFront 控制台中查看此策略](https://console.aws.amazon.com/cloudfront/v4/home#/policies/cache/83da9c7e-98b4-4e11-a168-04f0df8e2c65)

此策略设计用于符合以下条件的源：返回 `Cache-Control` HTTP 响应标头，且不会根据查询字符串中存在的值提供不同内容。如果源会根据查询字符串中存在的值提供不同内容，请考虑使用 [UseOriginCacheControlHeaders-QueryStrings](#managed-cache-policy-origin-cache-headers-query-strings)。

在使用 CloudFormation、AWS CLI 或 CloudFront API 时，此策略的 ID 为：

`83da9c7e-98b4-4e11-a168-04f0df8e2c65`

此策略包含以下设置：
+ **最小 TTL：**0 秒
+ **最大 TTL：**31536000 秒（365 天）
+ **原定设置 TTL：**0 秒
+ **缓存键中包含的标头：**
  + `Host`
  + `Origin`
  + `X-HTTP-Method-Override`
  + `X-HTTP-Method`
  + `X-Method-Override`

  还包含标准化的 `Accept-Encoding` 标头，因为已启用缓存压缩对象设置。有关更多信息，请参阅[压缩支持](cache-key-understand-cache-policy.md#cache-policy-compressed-objects)。
+ **缓存键中包含的 Cookie：**包含所有 Cookie。
+ **缓存键中包含的查询字符串：**无。
+ **缓存压缩对象设置：**已启用。有关更多信息，请参阅[压缩支持](cache-key-understand-cache-policy.md#cache-policy-compressed-objects)。

## UseOriginCacheControlHeaders-QueryStrings
<a name="managed-cache-policy-origin-cache-headers-query-strings"></a>

[在 CloudFront 控制台中查看此策略](https://console.aws.amazon.com/cloudfront/v4/home#/policies/cache/4cc15a8a-d715-48a4-82b8-cc0b614638fe)

此策略设计用于符合以下条件的源：返回 `Cache-Control` HTTP 响应标头，且会根据查询字符串中存在的值提供不同内容。如果源不会根据查询字符串中存在的值提供不同内容，请考虑使用 [UseOriginCacheControlHeaders](#managed-cache-policy-origin-cache-headers)。

在使用 CloudFormation、AWS CLI 或 CloudFront API 时，此策略的 ID 为：

`4cc15a8a-d715-48a4-82b8-cc0b614638fe`

此策略包含以下设置：
+ **最小 TTL：**0 秒
+ **最大 TTL：**31536000 秒（365 天）
+ **原定设置 TTL：**0 秒
+ **缓存键中包含的标头：**
  + `Host`
  + `Origin`
  + `X-HTTP-Method-Override`
  + `X-HTTP-Method`
  + `X-Method-Override`

  还包含标准化的 `Accept-Encoding` 标头，因为已启用缓存压缩对象设置。有关更多信息，请参阅[压缩支持](cache-key-understand-cache-policy.md#cache-policy-compressed-objects)。
+ **缓存键中包含的 Cookie：**包含所有 Cookie。
+ **缓存键中包含的查询字符串：**包含所有查询字符串。
+ **缓存压缩对象设置：**已启用。有关更多信息，请参阅[压缩支持](cache-key-understand-cache-policy.md#cache-policy-compressed-objects)。

# 了解缓存键
<a name="understanding-the-cache-key"></a>

*缓存键* 确定发送到 CloudFront 边缘站点的查看器请求是否导致*缓存命中*。缓存键是缓存中对象的唯一标识符。缓存中的每个对象都有一个唯一的缓存键。

如果查看器请求生成与先前请求相同的缓存键，并且该缓存键的对象位于边缘站点的缓存中且有效，则会发生缓存命中。当存在缓存命中时，请求的对象将从 CloudFront 边缘站点提供给查看器，这具有以下好处：
+ 减少了源服务器上的负载
+ 缩短了查看器的延迟

*缓存命中率*越高（当查看器请求比例较高时，会发生缓存命中），网站或应用程序的性能就越佳。提高缓存命中率的一种方法是仅在缓存键中包含最少的必要值。有关更多信息，请参阅以下部分。

您可以使用[缓存策略](controlling-the-cache-key.md)修改缓存键中的值（URL 查询字符串、HTTP 标头和 Cookie）。（您也可以在查看器请求上使用 [Lambda@Edgefunction](lambda-at-the-edge.md) 或 [CloudFront Functions](cloudfront-functions.md) 来修改缓存键。） 在修改缓存键之前，请务必了解应用程序的设计方式以及它何时以及如何根据查看器请求的特征提供不同的响应。当查看器请求中的某个值确定源返回的响应时，您应在缓存键中包含该值。但是，如果您在缓存键中包含的值不会影响源返回的响应，则可能最终会缓存重复的对象。

## 默认缓存键
<a name="cache-key-default"></a>

默认情况下，CloudFront 分配的缓存键包括以下信息：
+ CloudFront 分配的域名（例如，d111111abcdef8.cloudfront.net）
+ 请求的对象的 URL 路径（例如 `/content/stories/example-story.html`）

**注意**  
`OPTIONS` 方法包含在 `OPTIONS` 请求的缓存键中。这意味着 `OPTIONS` 请求的响应将与 `GET` 和 `HEAD` 请求的响应单独缓存。

默认情况下，查看器请求中的其他值不会包含在缓存键中。请考虑来自 Web 浏览器的以下 HTTP 请求。

```
            GET /content/stories/example-story.html?ref=0123abc&split-pages=false HTTP/1.1
            Host: d111111abcdef8.cloudfront.net
            User-Agent: Mozilla/5.0 Gecko/20100101 Firefox/68.0
            Accept: text/html,*/*
            Accept-Language: en-US,en
            Cookie: session_id=01234abcd
            Referer: https://news.example.com/
```

当与此示例类似的查看器请求到达 CloudFront 边缘站点时，CloudFront 将使用缓存键来确定是否存在缓存命中。默认情况下，缓存键中仅包含请求的以下组件：`/content/stories/example-story.html` 和 `d111111abcdef8.cloudfront.net`。如果请求的对象不在缓存中（缓存未命中），则 CloudFront 会向源发送请求以获取该对象。获取该对象后，CloudFront 会将它返回到查看器并将它存储在边缘站点的缓存中。

当 CloudFront 收到由缓存键确定的同一对象的另一个请求时，CloudFront 会立即将缓存对象提供给查看器，而不会向源发送请求。例如，请考虑以下 HTTP 请求，该请求在上一个请求之后到达。

```
            GET /content/stories/example-story.html?ref=xyz987&split-pages=true HTTP/1.1
            Host: d111111abcdef8.cloudfront.net
            User-Agent: Mozilla/5.0 AppleWebKit/537.36 Chrome/83.0.4103.116
            Accept: text/html,*/*
            Accept-Language: en-US,en
            Cookie: session_id=wxyz9876
            Referer: https://rss.news.example.net/
```

虽然该请求与上一个请求都对应于相同的对象，但它与上一个请求不同。它具有不同的 URL 查询字符串、`User-Agent` 和 `Referer` 标头，以及不同的 `session_id` Cookie。但默认情况下，所有这些值都不是缓存键的一部分，因此第二个请求会导致发生缓存命中。

## 自定义缓存键
<a name="cache-key-custom"></a>

在某些情况下，即使这样做可能会导致更少的缓存命中，您仍可能希望在缓存键中包含更多信息。您可以使用[缓存策略](controlling-the-cache-key.md)指定要包含在缓存键中的内容。

例如，如果您的源服务器使用查看器请求中的 `Accept-Language` HTTP 标头来根据查看器的语言返回不同的内容，则您可能希望在缓存键中包含此标头。在执行该操作时，CloudFront 会使用此标头确定缓存命中，并在*源请求*（当缓存未命中时，CloudFront 发送到源的请求）中包含标头。

在缓存键中包含其他值的一个潜在后果是，由于查看器请求中可能发生的变化，CloudFront 最终可能会缓存重复的对象。例如，查看器可能会为 `Accept-Language` 标头发送以下任意值：
+ `en-US,en`
+ `en,en-US`
+ `en-US, en`
+ `en-US`

所有这些不同的值都表明查看器的语言是英语，但变体可能会导致 CloudFront 将同一个对象缓存多次。这会减少缓存命中数并增加源请求的数量。您可以避免此重复情况，方法是不在缓存键中包含 `Accept-Language` 标头，而是将您的网站或应用程序配置为将不同的 URL 用于不同语言的内容（例如 `/en-US/content/stories/example-story.html`）。

对于要包含在缓存键中的任何给定值，您应确保了解查看器请求中可能会出现的不同变体的数量。对于某些请求值，将它们包含在缓存键中几乎没有意义。例如，`User-Agent` 标头可以有数千个唯一变体，因此通常不适合将它作为包含在缓存键中的候选项。也不适合将具有用户特定的值或会话特定的值并且在数千个（甚至数百万个）请求中唯一的 Cookie 作为包含在缓存键中的候选项。如果您确实在缓存键中包含这些值，则每个唯一变体都会导致缓存中存在对象的另一个副本。如果对象的这些副本都不是唯一的，或者如果您最终获得了大量略微不同的对象，而每个对象只获得少量的缓存命中，则可能需要考虑另一种方法。您可以从缓存键中排除这些高度可变的值，也可以将对象标记为不可缓存。

在自定义缓存键时，请保持谨慎。有时这样做是可取的，但可能会产生意想不到的后果，例如缓存重复的对象、降低缓存命中率以及增加源请求的数量。如果您的源网站或应用程序需要接收来自查看器请求的特定值以进行分析、遥测或实现其他目的，但这些值不会更改源返回的对象，请使用[源请求策略](controlling-origin-requests.md)在源请求中包含这些值，但*不* 将它们包含在缓存键中。