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

控制缓存键

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

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

  • 缩短了查看器的延迟

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

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

了解缓存策略

利用缓存策略,您可以通过控制缓存键中包含的值(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 包含在缓存键和源请求中的查看器请求中的 URL 查询字符串。对于查询字符串,可以选择下列设置之一:

  • – 查看器请求中的查询字符串 会包含在缓存键中,也 会自动包含在源请求中。

  • 全部 – 查看器请求中的所有查询字符串都包含在缓存键中,并且也会自动包含在源请求中。

  • 白名单 – 您可以指定查看器请求中的哪些查询字符串包含在缓存键中,并且会自动包含在源请求中。

  • 全部-例外项 – 您可以指定查看器请求中的哪些查询字符串 包含在缓存键中,并且 会自动包含在源请求中。所有其他查询字符串(您指定的查询字符串除外) 包含在缓存键中,并且会自动包含在源请求中。

在使用白名单全部-例外项设置时,可以按查询字符串的名称(而不是值)指定它们。例如,请考虑以下 URL 路径:

/content/stories/example-story.html?split-pages=false

在此情况下,您可以将查询字符串指定为 split-pages,而不是指定为 split-pages=false。但是,CloudFront 会将完整的查询字符串(包括其值)包含在缓存键和源请求中。

标头

CloudFront 包含在缓存键和源请求中的查看器请求中的 HTTP 标头。对于标头,您可以选择下列设置之一:

  • – 查看器请求中的 HTTP 标头 会包含在缓存键中,也 会自动包含在源请求中。

  • 白名单 – 您可以指定查看器请求中的哪些 HTTP 标头包含在缓存键中,并且会自动包含在源请求中。

在使用白名单设置时,您可以按 HTTP 标头的名称(而不是值)指定它们。例如,请考虑以下 HTTP 标头:

Accept-Language: en-US,en;q=0.5

在此情况下,您可以将标头指定为 Accept-Language,而不是指定为 Accept-Language: en-US,en;q=0.5。但是,CloudFront 会将完整标头(包括其值)包含在缓存键和源请求中。

您还可以将 CloudFront 生成的某些标头包含在缓存键中。有关更多信息,请参阅 使用 CloudFront HTTP 标头

Cookie

CloudFront 包含在缓存键和源请求中的查看器请求中的 Cookie。对于 Cookie,您可以选择下列设置之一:

  • – 查看器请求中的 Cookie 会包含在缓存键中,也 会自动包含在源请求中。

  • 全部 – 查看器请求中的所有 Cookie 都包含在缓存键中,也会自动包含在源请求中。

  • 白名单 – 您可以指定查看器请求中的哪些 Cookie 包含在缓存键中,并且会自动包含在源请求中。

  • 全部-例外项 – 您可以指定查看器请求中的哪些 Cookie 包含在缓存键中,并且 会自动包含在源请求中。所有其他 Cookie(您指定的 Cookie 除外) 包含在缓存键中,并且会自动包含在源请求中。

在使用白名单全部-例外项设置时,可以按 Cookie 的名称(而不是值)指定它们。例如,请考虑以下 Cookie 标头:

Cookie: session_ID=abcd1234

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

压缩支持

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

注意

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

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

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

  • 当查看器支持 Brotli 压缩对象时,您的源将返回这些对象(请求包含带 brAccept-Encoding 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 标头一样,可以将此标头包含在缓存策略或源请求策略中的标头白名单中。

创建缓存策略

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

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

创建缓存策略(控制台)

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

  2. 选择创建缓存策略

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

  4. 完成后,选择创建缓存策略

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

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

  1. 在 CloudFront 控制台中打开分配页面,网址为 https://console.amazonaws.cn/cloudfront/home#distributions:

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

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

    或者,要创建新的缓存行为,请选择创建行为

  4. 对于缓存和源请求设置,请确保选择使用缓存策略和源请求策略

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

  6. 在页面底部选择是,编辑

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

  1. 通过 https://console.amazonaws.cn/cloudfront/home 打开 CloudFront 控制台。

  2. 选择创建分配,然后为 Web 选择开始

  3. 对于缓存和源请求设置,请确保选择使用缓存策略和源请求策略

  4. 对于缓存策略,选择要附加到此分配的默认缓存行为的缓存策略。

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

  6. 完成后,选择创建分配

要使用 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。利用 Amazon CLI 的版本 1,您可以生成 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。利用 Amazon CLI 的版本 1,您可以生成 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。利用 Amazon CLI 的版本 1,您可以生成 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

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

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

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