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