将Cache-Control的max-age设置为0,s-maxage不为0是否有意义?

3
有人在关于缓存的 这个问题 上发表了评论:

...使用 Cache-Control 值:max-age=0, s-maxage=604800,似乎可以使我的期望行为实现,用户可以即时看到更新后的页面内容,但仍然可以在 CDN 层面进行缓存。

那么,我真的可以在 CDN 层面进行缓存并即时更新吗?

这样做有意义吗?这种组合是如何起作用的?

1个回答

2

是的,这很有道理。

使用评论中提到的配置后,您的用户将得到“即时”过期的响应,因此下次请求时他们必须进行验证。CDN将缓存有效响应604800秒。因此,重复的请求将大多由CDN提供服务,而不是源服务器。

但是如果您更新了应用程序呢?CDN上的过期缓存会发生什么情况?

在新部署之后,您需要确保清除CDN中的所有过期缓存/清除。

例如,请参见从Cloudflare清除缓存资源:它为您提供了许多选项。

  • 按单个文件(按URL)清除
  • 通过Cloudflare仪表板清除单个文件
  • 清除所有内容
  • 通过API清除缓存资源
  • 等等

例如,Firebase Hosting将在新部署后清除所有CDN缓存:

任何请求的静态内容都会自动缓存在CDN上。如果重新部署您网站的内容,Firebase Hosting会自动清除CDN上所有缓存的静态内容,直到下一次请求。

就评论中建议的设置而言,我认为Cache-Control: no-cache会做得更好。

来自MDN - Cache Control

no-cache

响应可以被任何缓存存储,即使响应通常是不可缓存的。但是,在使用它之前,存储的响应必须始终首先通过验证与原始服务器进行验证,因此,您不能将no-cache与immutable结合使用。如果要在任何缓存中不存储响应,请改用无存储。这个指令不能有效地防止缓存存储您的响应。


我们不使用no-cache的原因是它总是绕过CDN并在每次调用时命中源服务器进行重新验证。如果您希望重新验证通过CDN进行,并且计划在部署后清除缓存,s-maxage和maxage似乎是更好的选择。 - undefined

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接