一个-Control控制、带指纹资源:永久缓存天下武功
优采云 发布时间: 2021-08-08 02:34一个-Control控制、带指纹资源:永久缓存天下武功
一个更好的缓存策略只需要两部分,只需要通过Cache-Control来控制:
带指纹资源:永久缓存 不带指纹资源:每次都检查新鲜度
图如下:
有指纹的资源:永久缓存
Cache-Control: max-age=31536000
天下武功皆无敌,唯快不破。请求资源最快的方式是不向服务器发起请求,通过上面的响应头可以永久缓存资源。
静态资源有一个hash值,即指纹。为资源设置一年的过期时间,即31536000,一般认为是永久缓存。在永久缓存期间,浏览器不需要向服务器发送请求
那为什么有hash值的资源可以永远缓存呢?
因为当文件内容改变时,会生成一个带有新hash值的URL。前端将发起对新 URL 的请求。
非指纹资源:每次都检查新鲜度
Cache-Control: no-cache
因为没有指纹,所以每次都需要验证资源的新鲜度。 (从缓存中获取资源,可能是过期资源)如果验证为最新资源,则从浏览器缓存中加载资源
index.html 是没有指纹的资源。如果是放在缓存中,如何保证服务器刷新数据时浏览器能获取到新鲜的资源?
因此,当使用Cache-Control: no-cache时,客户端每次都会检查服务器的新鲜度。
PS:no-cache 和 no-store 有什么区别? (打开新窗口)
即使每次都检查新鲜度,也不需要每次都从服务器下载资源:如果浏览器/CDN上的缓存经过验证没有过期。这称为协商缓存。此时http状态码返回304,表示Not Modified,即没有变化。
幸运的是,您不需要管理或配置协商缓存。 Nginx或者一些OSS会自动配置协商缓存。
<p>至于协商缓存,也有自己的算法。协商缓存基于响应头 Last-Modified/ETag。浏览器每次请求资源时,都会携带上次服务器响应的ETag/Last-Modified作为标志,与此时服务器的ETag/Last-Modified进行比较,判断内容变化。