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

控制缓存键

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

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

  • 缩短了查看器的延迟

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

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

创建缓存策略

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

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

Console

创建缓存策略(控制台)

  1. 登录到 Amazon Web Services Management Console 并通过以下网址在 CloudFront 控制台中打开 Policies (策略) 页面:https://console.amazonaws.cn/cloudfront/v3/home?#/policies

  2. 选择创建缓存策略

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

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

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

将缓存策略附加到现有分配(控制台)

  1. 在 CloudFront 控制台中打开 Distributions (分配) 页面,网址为 https://console.amazonaws.cn/cloudfront/v3/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/v3/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
    注意

    yaml-input 选项仅适用于 Amazon CLI 版本 2。利用版本 1 的 Amazon CLI,您可以生成 JSON 格式的输入文件。有关更多信息,请参阅 Amazon Command Line Interface 用户指南中的从 JSON 或 YAML 输入文件生成 Amazon CLI 骨架和输入参数

  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
    注意

    --output yaml 选项仅适用于 Amazon CLI 版本 2。利用版本 1 的 Amazon CLI,您可以生成 JSON 格式的输出。有关更多信息,请参阅 Amazon Command Line Interface 用户指南中的从 Amazon CLI 控制命令输出

  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
    注意

    yaml-input 选项仅适用于 Amazon CLI 版本 2。利用版本 1 的 Amazon CLI,您可以生成 JSON 格式的输入文件。有关更多信息,请参阅 Amazon Command Line Interface 用户指南中的从 JSON 或 YAML 输入文件生成 Amazon CLI 骨架和输入参数

  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 缓存中保留的最大时间量(以秒为单位)。仅当源对象随对象发送 Cache-ControlExpires 标头时,CloudFront 才使用此设置。有关更多信息,请参阅 管理内容保留在缓存中的时间长度(过期)

默认 TTL

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

缓存键设置

缓存键设置指定 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 HTTP 标头

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 可以在查看器支持 Gzip 或 Brotli 压缩格式时,请求和缓存以该压缩格式压缩的对象。这些设置还允许 CloudFront 压缩功能发挥作用。查看器通过 Accept-Encoding HTTP 标头表示它们支持这些压缩格式。

注意

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

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

  • 当查看器支持 Gzip 压缩对象时,您的源将返回这些对象(请求包含带 Accept-Encodinggzip HTTP 标头作为值)。在此情况下,使用启用了 Gzip 设置(在 CloudFront API、Amazon 开发工具包、Amazon CLI 或 Amazon CloudFormation 中将 EnableAcceptEncodingGzip 设置为 true)。

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

  • 此缓存策略附加到的缓存行为将通过 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 标头中的其他值。

如果查看器支持一种压缩格式,而不支持另一种压缩格式例如,如果 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 标头不包含 brgzip 作为值,则 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 标头一样,可以将此标头包含在缓存策略或源请求策略中的标头列表中。