CloudFront 不添加 Cache-Control 标头。如果源服务器提供它,它会将其传递给浏览器。
如果您在将对象上传到 S3 时没有设置 Cache-Control 标头,那么您需要再次上传您的对象或进入 S3 控制台并将标头添加到对象,值为 @987654323 @ 如果您希望 浏览器 将对象缓存长达一年。
如果您将 CloudFront 配置为“使用原始缓存标头”,则 CloudFront 将使用来自 Cache-Control 的 max-age 值来确定对象可以在 CloudFront 缓存多长时间,除非 s-maxage 值也存在,在这种情况下,CloudFront 将使用它。
如果您配置最小/最大/默认值,CloudFront 将使用这些计数器来确定对象可以缓存多长时间:
- minimum:即使
Cache-Control: max-age(或s-maxage,如果存在)具有较低的值,对象也可以缓存至少这么长时间。事实上,将 Minimum TTL 设置为非零值会导致 CloudFront 忽略 Cache-Control 指令 no-cache、no-store 和 private,并将它们缓存到值 Minimum TTL - 在您想要的情况下很有用浏览器查看这些值,但您仍希望 CloudFront 缓存对象。
- 最大值:即使
Cache-Control: max-age 具有更高的值,对象的缓存时间也不会超过此值。
- 默认值:如果在对象上看不到
Cache-Control,则对象可能会被缓存这么长时间。你不应该需要这个,因为你应该有Cache-Control标题无处不在。
关于这些设置的重要注意事项:
- 它们只影响 CloudFront 缓存,而不影响浏览器缓存。
- 一旦对象被 CloudFront 缓存,它就无法知道该对象已在 S3 中更改。在计时器到期之前,它可能不会再次检查。
- 尝试通过在 CloudFront 中设置过长的时间(例如一年)来“强制”CloudFront 在缓存中长时间保留对象没有什么意义,因为 CloudFront 可以随时从其缓存中清除任何对象出于任何原因 - 缓存本质上是易失的。对象的流行度(或不流行度)可能会触发 CloudFront 在计时器到期之前清除它。在下一个请求中,它将由 CloudFront 从源中获取。
同样重要的是,CloudFront 有两个按地理位置组织的缓存层——区域(内部)和边缘(外部)。边缘缓存数量更多且地理分布更广,但区域缓存具有更大的存储容量。如果您通过 CloudFront 获取对象,CloudFront 将缓存该对象某处(在一个区域缓存或一个边缘缓存或每个缓存中),但下一个请求 - 可能来自浏览器不同的地理区域——可能会经过一个边缘和一个区域,该对象以前从未被请求过。另一方面,它可能是通过没有它的边缘请求的,但它会从区域缓存中获取。尝试记住这一点,因为您了解 任何给定对象在任何给定时间都不能正确地说是在缓存中或不在缓存中是什么意思,因为没有“ “缓存。世界上有多个缓存,其中许多不相互通信,因为这会使事情变得更慢,而不是更快。如果您的网站在澳大利亚很受欢迎但在英国不受欢迎,则您的对象的副本可能会缓存在亚太地区的缓存位置,而不是西欧的缓存位置。此行为是自动的,不是您配置的,但您需要注意 CloudFront 没有单一的整体缓存。对象被缓存在它们被访问的地方。
是否有任何工具可以检查 S3 和 cloudFront 部署,即返回的标头
你的眼球是最好的工具。浏览器中的响应标头告诉您需要了解的内容:
Age: 是多久前(以秒为单位)CloudFront 在其缓存中拥有此对象。
X-Cache: Hit from cloudfront 表示 CloudFront 不必从 S3 获取对象,因为它已被缓存。 Miss from cloudfront 表示 CloudFront 在处理此请求的边缘的缓存中没有对象,需要从 S3 获取它。
命令行实用程序curl 及其-v 选项也可用于观察Web 标头。