我正在尝试使用document来了解Minimum TTLMaximum TTLDefault 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 。停。

    否则,使用在上一步中发现的值:
  • 如果小于最小TTL ,则将对象的TTL设置为最小TTL。否则,
  • 如果大于 Maximum TTL ,则将对象的TTL设置为Maximum TTL;否则,
  • 使用在上一步中找到的值作为对象的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已知的,因此此值不会影响浏览器缓存。

    07-24 09:39
    查看更多