控制缓存键 - Amazon CloudFront
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅 中国的 Amazon Web Services 服务入门 (PDF)

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

控制缓存键

借助 Amazon CloudFront,您可以控制在 CloudFront 边缘站点缓存的对象的缓存密钥。缓存键是缓存中每个对象的唯一标识符,它决定查看器请求是否导致缓存命中。如果查看器请求生成与先前请求相同的缓存键,并且该缓存键的对象位于边缘站点的缓存中且有效,则会发生缓存命中。当出现缓存命中时,会从 CloudFront 边缘位置向查看者提供对象,这具有以下好处:

  • 减少了源服务器上的负载

  • 缩短了查看器的延迟

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

要控制缓存密钥,您可以使用 CloudFront 缓存策略。您可以将缓存策略附加到 CloudFront 分配中的一个或多个缓存行为。

创建缓存策略

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

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

Console
创建缓存策略(控制台)
  1. 登录Amazon Web Services Management Console并在 CloudFront 控制台中打开策略页面,网址为https://console.amazonaws.cn/cloudfront/v4/home?#/policies

  2. 选择创建缓存策略

  3. 为此缓存策略选择所需的设置。有关更多信息,请参阅 了解缓存策略

  4. 完成后,选择 Create(创建)。

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

将缓存策略附加到现有分配(控制台)
  1. 在 CloudFront 控制台中打开发行版页面,网址为https://console.amazonaws.cn/cloudfront/v4/home#/distributions

  2. 选择要更新的分配,然后选择行为选项卡。

  3. 选择要更新的缓存行为,然后选择编辑

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

  4. Cache key and origin requests(缓存键和源请求)区域,请确保选择了 Cache policy and origin request policy(缓存策略和源请求策略)。

  5. 对于 Cache policy(缓存策略),选择要附加到此缓存行为的缓存策略。

  6. 在页面底部,选择 Save changes(保存更改)。

将缓存策略附加到新分配(控制台)
  1. 打开 CloudFront 控制台,网址为https://console.amazonaws.cn/cloudfront/v4/home

  2. 选择 Create distribution(创建分配)。

  3. Cache key and origin requests(缓存键和源请求)区域,请确保选择了 Cache policy and origin request policy(缓存策略和源请求策略)。

  4. 对于 Cache policy(缓存策略),选择要附加到此分发的原定设置缓存行为的缓存策略。

  5. 为源、原定设置缓存行为和其他分配设置选择所需的设置。有关更多信息,请参阅 您创建或更新分配时指定的值

  6. 完成后,选择 Create distribution(创建分配)。

CLI

要使用 Amazon Command Line Interface (Amazon 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
  2. 打开刚创建的名为 cache-policy.yaml 的文件。编辑该文件以指定所需的缓存策略设置,然后保存该文件。您可以从该文件中删除可选字段,但不要删除必填字段。

    有关缓存策略设置的更多信息,请参阅了解缓存策略

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

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

    记下命令输出中的 Id 值。这是缓存策略 ID,您需要使用它来将缓存策略附加到 CloudFront 分配的缓存行为。

将缓存策略附加到现有分配(带输入文件的 CLI)
  1. 使用以下命令保存要更新的 CloudFront 发行版的分发配置。将 distribution_ID 替换为分配的 ID。

    aws cloudfront get-distribution-config --id distribution_ID --output yaml > dist-config.yaml
  2. 打开刚创建的名为 dist-config.yaml 的文件。编辑该文件,对要更新的每个缓存行为进行以下更改以使用缓存策略。

    • 在缓存行为中,添加名为 CachePolicyId 的字段。对于字段的值,请使用创建策略后记下的缓存策略 ID。

    • 从缓存行为中删除 MinTTLMaxTTLDefaultTTLForwardedValues 字段。这些设置是在缓存策略中指定的,因此不能将这些字段和一个缓存策略包含在相同的缓存行为中。

    • ETag 字段重命名为 IfMatch,但不更改字段的值。

    完成后保存该文件。

  3. 使用以下命令更新分配以使用缓存策略。将 distribution_ID 替换为分配的 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
  2. 打开刚创建的名为 distribution.yaml 的文件。在默认缓存行为中,在 CachePolicyId 字段中输入创建策略后记下的缓存策略 ID。继续编辑该文件以指定所需的分配设置,然后在完成后保存该文件。

    有关分配设置的更多信息,请参阅您创建或更新分配时指定的值

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

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

要使用 CloudFront API 创建缓存策略,请使用CreateCachePolicy。有关您在此 API 调用中指定的字段的更多信息,请参阅了解缓存策略以及 Amazon 开发工具包或其他 API 客户端的 API 参考文档。

创建缓存策略后,可以使用下列 API 调用之一将该缓存策略附加到缓存行为:

对于这两个 API 调用,请在缓存行为中的 CachePolicyId 字段中提供缓存策略的 ID。有关您在这些 API 调用中指定的其他字段的更多信息,请参阅 您创建或更新分配时指定的值 以及 Amazon 开发工具包或其他 API 客户端的 API 参考文档。

了解缓存策略

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

缓存策略包含以下设置,这些设置的分类如下:策略信息生存时间 (TTL) 设置缓存键设置

策略信息

名称

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

说明

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

生存时间 (TTL) 设置

生存时间 (TTL) 设置与Cache-ControlExpires HTTP 标头(如果它们在源响应中)配合使用,以确定 CloudFront 缓存中对象的有效期限。

最小 TTL

在向源 CloudFront 检查对象是否已更新之前,您希望对象在 CloudFront 缓存中停留的最短时间(以秒为单位)。有关更多信息,请参阅管理内容保留在缓存中的时间长度(过期)

最大 TTL

在向源 CloudFront 检查对象是否已更新之前,对象在 CloudFront缓存中停留的最长时间(以秒为单位)。 CloudFront 仅当源发送对象Cache-ControlExpires标头时,才使用此设置。有关更多信息,请参阅管理内容保留在缓存中的时间长度(过期)

默认 TTL

在 CloudFront 检查源以查看对象是否已更新之前,您希望对象在 CloudFront 缓存中停留的默认时间(以秒为单位)。 CloudFront 仅当源发送该对象Cache-ControlExpires标头时,才使用此设置的值作为对象的 TTL。有关更多信息,请参阅管理内容保留在缓存中的时间长度(过期)

注意

如果最小 TTL、最大 TTL默认 TTL 设置都设置为 0,则会禁用缓存。 CloudFront

缓存键设置

缓存密钥设置指定了缓存密钥中 CloudFront 包含的查看者请求中的值。这些值可以包括 URL 查询字符串、HTTP 标头和 Cookie。缓存键中包含的值将自动包含在 CloudFront 发送到源的请求(称为源请求)中。有关在不影响缓存键的情况下控制源请求的信息,请参阅控制源请求

缓存键设置包括:

标头

缓存密钥和源请求中 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 请求标头

Cookie

缓存密钥和原始请求中 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 允许请求和缓存以 Gzip 或 Brotli 压缩格式压缩的对象(如果查看器支持)。这些设置还允许 CloudFront 压缩发挥作用。查看器通过 Accept-Encoding HTTP 标头表示它们支持这些压缩格式。

注意

Chrome 和 Firefox Web 浏览器仅在使用 HTTPS 发送请求时支持 Brotli 压缩。这些浏览器不支持带 HTTP 请求的 Brotli。

在满足以下任一条件时,启用这些设置:

  • 当查看器支持 Gzip 压缩对象时,您的源将返回这些对象(请求包含带 gzipAccept-Encoding HTTP 标头作为值)。在这种情况下,请使用启用 Gzip 的设置EnableAcceptEncodingGziptrue在 CloudFront API、Amazon SDK 或Amazon CloudFormation中设置为)。Amazon CLI

  • 当查看器支持 Brotli 压缩对象时,您的源将返回这些对象(请求包含带 brAccept-Encoding HTTP 标头作为值)。在这种情况下,请使用启用 Brotli 的设置(true在 CloudFront API、Amazon SDK 或中设置为EnableAcceptEncodingBrotli)。Amazon CLI Amazon CloudFormation

  • 此缓存策略附加到的缓存行为将通过 CloudFront 压缩进行配置。在此情况下,可以为 Gzip 和/或 Brotli 启用缓存。启用 CloudFront 压缩后,启用两种格式的缓存有助于降低将数据传输到 Internet 的成本。

注意

如果您为其中一种或两种压缩格式启用缓存,请不要在与相同缓存行为关联的源请求策略中包含Accept-Encoding标头。 CloudFront当为这两种格式启用缓存时,始终在源请求中包含此标头,因此包含Accept-Encoding在源请求策略中无效。

如果您的源服务器未返回 Gzip 或 Brotli 压缩对象,或者缓存行为未配置为 CloudFront 压缩,请不要为压缩对象启用缓存。如果这样做的话,可能会导致缓存命中率下降。

以下内容说明了这些设置如何影响 CloudFront 分发。以下所有方案都假定查看器请求包含 Accept-Encoding 标头。当查看者请求不包含Accept-Encoding标头时, CloudFront 不会在缓存密钥中包含此标头,也不会将其包含在相应的原始请求中。

在为两种压缩格式支持缓存压缩对象的情况下

如果查看器同时支持 Gzip 和 Brotli(也就是说,如果gzipbr值都在查看器请求的Accept-Encoding标题中),则执行以下操作:CloudFront

  • 将标头标准化为 Accept-Encoding: br,gzip 并将标准化的标头包含在缓存键中。缓存键不包含查看器发送的 Accept-Encoding 标头中的其他值。

  • 如果边缘站点在缓存中具有与请求匹配的 Brotli 或 Gzip 压缩对象,并且未过期,则边缘站点会将此对象返回给查看器。

  • 如果边缘站点的缓存中没有与请求匹配且未过期的 Brotli 或 Gzip 压缩对象,则在相应的源请求中 CloudFront 包含标准化标头 (Accept-Encoding: br,gzip)。源请求不包含查看器发送的 Accept-Encoding 标头中的其他值。

如果查看器支持一种压缩格式但不支持另一种压缩格式(例如,if 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或作为值):gzipCloudFront

  • 不会将 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 会将Accept-Encoding标头视为查看器请求中的任何其他 HTTP 标头。默认情况下,它不包括在缓存键中,也不包括在源请求中。与任何其他 HTTP 标头一样,可以将此标头包含在缓存策略或源请求策略中的标头列表中。