【问题标题】:Does it make sense to set Cache-Control max-age=0 and s-maxage= not zero?设置 Cache-Control max-age=0 和 s-maxage= 不为零是否有意义?
【发布时间】:2021-05-12 11:55:37
【问题描述】:
有人评论this question关于缓存:
...使用 Cache-Control 值:max-age=0, s-maxage=604800 似乎可以获得我想要的即时客户端更新新页面内容的行为,但仍然在 CDN 级别缓存
我真的会在 CDN 级别获得缓存并为我的用户提供即时更新吗?
这有意义吗?这种组合如何运作?
【问题讨论】:
标签:
caching
header
cache-control
max-age
s-maxage
【解决方案1】:
是的,这是有道理的。
使用该评论中提到的配置,您的用户将收到 instant 过时的响应,因此他们必须在下次发出请求时对其进行验证。 CDN 会将有效响应缓存604800 秒。因此,重复的请求将主要由 CDN 提供,而不是 Origin 服务器。
但是如果你更新你的应用呢? CDN 上的陈旧缓存会发生什么情况?
新部署后,您需要确保 CDN 中的所有陈旧缓存都将被清除/清除。
例如,请参阅Purging cached resources from Cloudflare:它为您提供了多种选择。
- 按单个文件(按 URL)清除
- 通过 Cloudflare 仪表板按单个文件清除
- 清除一切
- 通过 API 清除缓存资源
- 等
例如Firebase Hosting会在新部署后清除所有CDN缓存:
任何请求的静态内容都会自动缓存在 CDN 上。如果您重新部署网站的内容,Firebase 托管会自动清除 CDN 中所有缓存的静态内容,直到下一次请求为止。
就评论中建议的设置而言,我认为Cache-Control: no-cache 会做得更好。
来自MDN - Cache Control:
无缓存
响应可能由任何缓存存储,即使响应通常是不可缓存的。但是,存储的响应在使用之前必须始终通过原始服务器的验证,因此,您不能将 no-cache 与 immutable 结合使用。如果您不想将响应存储在任何缓存中,请改用 no-store。该指令在阻止缓存存储您的响应方面无效。