本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。
控制缓存键
借助 Amazon CloudFront,您可以控制在 CloudFront 边缘站点缓存的对象的缓存密钥。缓存键是缓存中每个对象的唯一标识符,它决定查看器请求是否导致缓存命中。如果查看器请求生成与先前请求相同的缓存键,并且该缓存键的对象位于边缘站点的缓存中且有效,则会发生缓存命中。当出现缓存命中时,会从 CloudFront 边缘位置向查看者提供对象,这具有以下好处:
-
减少了源服务器上的负载
-
缩短了查看器的延迟
缓存命中率越高(当查看器请求比例较高时,会发生缓存命中),网站或应用程序的性能就越佳。提高缓存命中率的一种方法是仅在缓存键中包含最少的必要值。有关更多信息,请参阅了解缓存键。
要控制缓存密钥,您可以使用 CloudFront 缓存策略。您可以将缓存策略附加到 CloudFront 分配中的一个或多个缓存行为。
创建缓存策略
利用缓存策略,您可以通过控制缓存键中包含的值(URL 查询字符串、HTTP 标头和 Cookie)来提高缓存命中率。您可以在 CloudFront 控制台中使用 Amazon Command Line Interface (Amazon CLI) 或 CloudFront API 创建缓存策略。
创建缓存策略后,将它附加到 CloudFront 分配中的一个或多个缓存行为。
了解缓存策略
利用缓存策略,您可以通过控制缓存键中包含的值(URL 查询字符串、HTTP 标头和 Cookie)来提高缓存命中率。 CloudFront 为常见使用案例提供了一些预定义的缓存策略(称作托管策略)。您可以使用这些托管策略,也可以创建特定于您的需求的缓存策略。有关托管策略的更多信息,请参阅使用托管缓存策略。
缓存策略包含以下设置,这些设置的分类如下:策略信息、生存时间 (TTL) 设置和缓存键设置。
策略信息
- 名称
-
用于标识缓存策略的名称。在控制台中,可以使用名称将缓存策略附加到缓存行为。
- 说明
-
用于描述缓存策略的注释。虽然此选项是可选的,但它可以帮助您确定缓存策略的用途。
生存时间 (TTL) 设置
生存时间 (TTL) 设置与Cache-Control
和 Expires
HTTP 标头(如果它们在源响应中)配合使用,以确定 CloudFront 缓存中对象的有效期限。
- 最小 TTL
-
在向源 CloudFront 检查对象是否已更新之前,您希望对象在 CloudFront 缓存中停留的最短时间(以秒为单位)。有关更多信息,请参阅管理内容保留在缓存中的时间长度(过期)。
- 最大 TTL
-
在向源 CloudFront 检查对象是否已更新之前,对象在 CloudFront缓存中停留的最长时间(以秒为单位)。 CloudFront 仅当源发送对象
Cache-Control
或Expires
标头时,才使用此设置。有关更多信息,请参阅管理内容保留在缓存中的时间长度(过期)。 - 默认 TTL
-
在 CloudFront 检查源以查看对象是否已更新之前,您希望对象在 CloudFront 缓存中停留的默认时间(以秒为单位)。 CloudFront 仅当源不发送该对象
Cache-Control
或Expires
标头时,才使用此设置的值作为对象的 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 请求标头。
-
-
缓存密钥和原始请求中 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 压缩对象时,您的源将返回这些对象(请求包含带
gzip
的Accept-Encoding
HTTP 标头作为值)。在这种情况下,请使用启用 Gzip 的设置EnableAcceptEncodingGzip
(true
在 CloudFront API、Amazon SDK 或Amazon CloudFormation中设置为)。Amazon CLI -
当查看器支持 Brotli 压缩对象时,您的源将返回这些对象(请求包含带
br
的Accept-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(也就是说,如果
gzip
和br
值都在查看器请求的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
或作为值):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 会将
Accept-Encoding
标头视为查看器请求中的任何其他 HTTP 标头。默认情况下,它不包括在缓存键中,也不包括在源请求中。与任何其他 HTTP 标头一样,可以将此标头包含在缓存策略或源请求策略中的标头列表中。
-