一个-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进行比较,判断内容变化。

0 个评论

要回复文章请先登录注册


官方客服QQ群

微信人工客服

QQ人工客服


线