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

了解缓存策略

利用缓存策略,您可以通过控制缓存键中包含的值(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。有关更多信息,请参阅 管理内容保留在缓存中的时间长度(过期)

注意

如果最小 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 设置(在 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 标头一样,可以将此标头包含在缓存策略或源请求策略中的标头列表中。