我正在尝试使用document来了解Minimum TTL
,Maximum TTL
和Default TTL
。
据我了解,当响应中出现Maximum TTL
来限制最大缓存时间时,将使用HTTP cache header
;当没有Default TTL
用作默认缓存时间时,将使用HTTP cache header
。
但是,对于Maximum TTL
,没有具体提及。
另外,它提到与转发头的关系。这是否意味着如果我将任何HTTP header 设置为转发到源,并且Minimum TTL
不为0,则不缓存任何内容?
最佳答案
在确定是否缓存对象以及缓存对象多长时间时,CloudFront使用以下逻辑:
检查具有以下值的任何Cache-Control
响应 header :
no-cache
no-store
private
如果遇到上述任何一种,请停止并将该对象的TTL¹设置为最小TTL 的配置值。非零值表示CloudFront将缓存原本不会缓存的对象。
否则,请找到源的指令以将对象缓存多长时间。 顺序,查找以下响应头之一:
Cache-Control: s-maxage=x
Cache-Control: max-age=x
Expires
停止使用此顺序遇到的第一个值,然后继续进行下一步。
如果未找到任何值,请使用默认TTL 。停。
否则,使用在上一步中发现的值:
参见https://docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/Expiration.html。
请务必注意,TTL确定了CloudFront允许将响应缓存多长时间。它并没有规定CloudFront缓存响应需要多长时间。如果很少访问对象,则CloudFront可以在TTL过期之前从缓存中逐出对象。
将一些(但不是全部) header 列入白名单以转发到源头不会改变上述任何逻辑。
它所做的更改是如何评估对象以确定缓存的响应是否可用。
例如,如果将
Origin
header 转发到原点,则Origin
header 的每个唯一值都会创建一个不同的缓存条目。然后将两个相同的请求(除了它们的Origin
header )视为不同的对象...因此,如果以后对同一个资源的请求包括Origin: https://one.example.com
,则不会使用Origin: https://two.example.com
的缓存响应。两者都将被发送到源,并且都将被独立缓存,以用于为将来的请求提供相同的匹配请求 header 。CloudFront这样做是因为,如果您需要将 header 转发到源,那么这意味着源可能会对列入白名单的 header 的不同值做出不同的 react ……因此将它们分别缓存。
因此,不必要地转发 header 将不必要地降低缓存命中率。
对于CloudFront可以缓存的同一资源的不同副本的数量,没有记录的限制(基于不同的 header )。
但是,将所有 header 转发到源头会将任何 future 请求真正相同的机会降低到几乎为零。这可能会消耗大量的缓存存储空间,从而存储了永远不会再使用的对象,因此CloudFront将其视为特殊情况,并且在这种情况下不允许进行任何缓存。因此,为了保持一致性,您需要将“最小TTL”设置为0。
¹此处使用的对象的TTL是指CloudFront的内部计时器,用于每个缓存的对象,该计时器跟踪允许其继续为缓存的对象提供服务的时间,而无需核对原点。 CloudFront内部对象的TTL仅是CloudFront已知的,因此此值不会影响浏览器缓存。