浏览器缓存策略

 规则 消息报头 值/示例 类型     作用
 新鲜度 expires     Thu, 18 Feb 2016 08:09:38 GMT 响应     告诉浏览器在过期时间之前可以使用缓存的副本
  program no-cache     响应 告诉浏览器忽略资源的缓存,http1.1可用cache-control代替
  cache-control no-cache     响应

这个很容易让人产生误解,使人误以为是响应不被缓存

。实际上 no-cache是会被缓存的,只不过每次在向客户端

(浏览器)提供响应数据时,缓存都要向服务器评估缓存响应的有效性。

   no-store 响应 响应不被缓存
   max-age=[秒] 响应 缓存的有效期
   public 响应 任何途径的缓存者(浏览器,代理服务器)都可以缓存本资源
   private 响应 只针对单个用户或实体缓存
  

Last-Modified

 Thu, 18 Feb 2016 08:09:38 GMT 响应    告诉浏览器本资源的最后修改时间
 校验值    etag FoSE56tq7pl53XZTHpn2XdsF4ZvG 响应 告诉浏览器当前资源的唯一标识(规则由服务器制定,比如md5戳)
  if-none-match FoSE56tq7pl53XZTHpn2XdsF4ZvG 请求 如果浏览器第一次请求的资源的etag非空,则再次请求该资源会把这个值带给服务器
     
    

Cache-Control与Expires

Cache-Control与Expires的作用一致,都是指明当前资源的有效期,控制浏览器是否直接从浏览器缓存取数据还是重新发请求到服务器取数据。只不过Cache-Control的选择更多,设置更细致,如果同时设置的话,其优先级高于Expires

Last-Modified/ETag与Cache-Control/Expires

配置Last-Modified/ETag的情况下,浏览器再次访问统一URI的资源,还是会发送请求到服务器询问文件是否已经修改,如果没有,服务器会只发送一个304回给浏览器,告诉浏览器直接从自己本地的缓存取数据;如果修改过那就整个数据重新发给浏览器;

Cache-Control/Expires则不同,如果检测到本地的缓存还是有效的时间范围内,浏览器直接使用本地副本,不会发送任何请求。两者一起使用时,Cache-Control/Expires的优先级要高于Last-Modified/ETag。即当本地副本根据Cache-Control/Expires发现还在有效期内时,则不会再次发送请求去服务器询问修改时间(Last-Modified)或实体标识(Etag)了。

一般情况下,使用Cache-Control/Expires会配合Last-Modified/ETag一起使用,因为即使服务器设置缓存时间, 当用户点击“刷新”按钮时,浏览器会忽略缓存继续向服务器发送请求,这时Last-Modified/ETag将能够很好利用304,从而减少响应开销。

Last-Modified与ETag

你可能会觉得使用Last-Modified已经足以让浏览器知道本地的缓存副本是否足够新,为什么还需要Etag(实体标识)呢?HTTP1.1中Etag的出现主要是为了解决几个Last-Modified比较难解决的问题:

  1. Last-Modified标注的最后修改只能精确到秒级,如果某些文件在1秒钟以内,被修改多次的话,它将不能准确标注文件的新鲜度

  2. 如果某些文件会被定期生成,当有时内容并没有任何变化,但Last-Modified却改变了,导致文件没法使用缓存

  3. 有可能存在服务器没有准确获取文件修改时间,或者与代理服务器时间不一致等情形

Etag是服务器自动生成或者由开发者生成的对应资源在服务器端的唯一标识符,能够更加准确的控制缓存。Last-Modified与ETag是可以一起使用的,服务器会优先验证ETag,一致的情况下,才会继续比对Last-Modified,最后才决定是否返回304。

本文标题:浏览器缓存策略
本文链接:https://56way.com/p/69.html
作者授权:除特别说明外,本文由 无路 原创编译并授权 小无路 刊载发布。
版权声明:本文不使用任何协议授权,您可以任何形式自由转载或使用。

发表评论

必填

选填

选填

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。