为什么即使没有任何缓存设置,CloudFront 也会缓存 s3 对象?

Why does CloudFront cache s3 object even though there aren't any cache settings?

我有一个 CloudFront 分布,其中 s3 个桶作为起点。

分发正在使用 Use Origin Cache Headers 设置。

附加设置如下。

之后,我通过S3控制台上传文件并尝试使用curl获取文件。(当然,没有Cache-Control元数据)

$ curl -X GET https://xxxxxxxxxxx/file -v
.
.
X-Cache: Miss from cloudfront
.
.
.
$ curl -X GET https://xxxxxxxxxxx/file -v
.
.
X-Cache: Hit from cloudfront.
.
.

我预计所有请求都应该 return cache-miss 因为没有任何地方的缓存设置(CloudFront 和 S3 对象元数据)。但是,如您所见,第二个请求是 returning cache-hit.

为什么 CloudFront 缓存它?

是否有任何隐藏的默认缓存设置?

控制台呈现这个的方式诚然是非常混乱的,甚至可以说不是 "correct."

CloudFront 始终使用原始缓存 headers 并且 始终使用 Min/Default/Max TTL。

Use Origin Cache Headers其实就是"Use Origin Cache Headers with standard CloudFront default and bounding values."

自定义其实就是"Use Origin Cache Headers with custom CloudFront default and bounding values."

因此 object 没有 Cache-Control 的缓存最多 Default TTL -- 默认情况下为 86400 秒。如果您不想要此行为,请切换到 Customize 并将 Default TTL 设置为您希望 CloudFront 用作 object TTL 的值(如果没有 Cache-Control 值被提供headers.

如果存在 Cache-Control ,CloudFront 将忽略 Default TTL 并使用边界值 Minimim TTLMaximum TTL 来确定它是应该在内部使用原点的 Cache-Control 值,还是覆盖它们。如果超出范围,CloudFront 会调整其内部计时器,使 object 的 TTL 在范围内 >= Minimum TTL(默认 0 秒)和 <= Maximum TTL(1 年)减少too-large 值到最大值,增加 too-small 值到最小值。如果 Cache-Control 值已在该范围内,则按原样使用 Cache-Control 中的值。无论哪种方式,CloudFront 实际上都不会修改 Cache-Control header 本身。

https://docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/Expiration.html