原文链接:浏览器缓存

浏览器缓存

强缓存 & 协商缓存

  • 强缓存
    释义: 客户端第一次问服务器要某个资源时,服务器丢还给客户端所请求的这个资源同时,告诉客户端将这个资源保存在本地,并且在未来的某个时点之前如果还需要这个资源,直接从本地获取就行了,不用向服务器请求.这种方式缓存下来的资源称为强缓存.

    Expires & Cache-Control:max-age

    • Expires:
      该字段是http1.0时的规范,值为一个绝对时间的GMT格式的时间字符串,代表缓存资源的过期时间,在这个时点之前,即命中缓存.
    • Cache-Control:
      该字段是http1.0时的规范,值为一个绝对时间的GMT格式的时间字符串,代表缓存资源的过期时间,在这个时点之前,即命中缓存.
      参数:
      no-cache: 如果请求头部包含no-cache指令,表示客户端不接收缓存过的响应.中间缓存服务器必须将请求转发给给源服务器. 浏览器强制刷新(window下ctrl+F5)就是这个原理,所以的请求都设置no-cache
      no-store: 暗示请求和响应包含机密信息,不能进行缓存.
      区分: no-store才是真正的不缓存
      max-age: 该指令用来标识缓存资源的最大有效期. 如果max-age=0,就会向源服务器发送请求进行缓存资源新鲜度的验证.浏览器普通刷新F5

      cache-directive 作为请求首部时,cache-directive 的可选值有:

      字段名称 说明
      no-cache 告知(代理)服务器不直接使用缓存,要求向原服务器发起请求.
      no-store 所有内容都不会保存到缓存或者Internet临时文件中.
      max-age=delta-seconds 告知 (代理)服务器,客户端希望接收一个存在时间不大于detal-seconds秒的资源.
      max-stale[=delta-seconds 告知 (代理)服务器,客户端愿意接收一个超过缓存时间的资源,若有定义delta-seconds则为delta-seconds,若没有则为任意超出的时间.
      min-fresh=delta-seconds 告知 (代理)服务器,客户端希望接收一个在小于delta-seconds秒内被更新过的资源.
      no-transform 告知 (代理)服务器,客户端希望获取实体数据没有被转换(比如压缩)过的资源.
      only-if-cached 告知 (代理)服务器,客户端希望获取换成的内容(若有),而不用向原来服务器请求.
      cache-extension 自定义扩展值,若服务器不识别改值则会被忽略.

      cache-directive 作为响应首部时,cache-directive 的可选值有:

      字段名称 说明
      public 表明任何情况下都得缓存该资源(即使是需要HTTP认证的资源).
      Private[="field-name"] 表明返回报文中全部或者部分(若指定field-name,则为field-name的字段数据)仅开放给某些用户(服务器指定的share-user,如代理服务器)做缓存使用,其他用户则不能缓存这些数据.
      no-cache 不直接使用缓存,要向服务器发起(新鲜度校验)请求.
      no-store 所有内容都不会保存到缓存或者Internet临时文件中.
      no-transform 告知客户端缓存文件时不得对实体数据做任何改变.
      only-if-cached 告知(代理)服务器,客户端希望获取缓存的内容(如果有),而不向原来服务器发起请求.
      must-revalidate 当前资源一定是向原服务器发起验证请求的,若请求失败会返回504(而非代理服务器上的缓存).
      proxy-revalidate 与must-revalidate类似,但仅能应用于共享缓存(如代理).
      max-age=delta-seconds 告知客户端,该资源在delta-seconds秒内是新鲜的,无需向 服务器发起请求.
      s-max-age=delta-seconds 同max-age,但仅用于共享缓存(如代理).
      cache-extension 自定义扩展值,若服务器不识别改值则会被忽略.
      在请求头中max-age=0与no-cache的区别?
         返回的状态来看:no-cache都是200,而max-age可能是304(如果浏览器有缓存).  
         请求参数:max-age请求头一般会携带If-Modified-Since或If-None-Match字段进行新鲜度验证,而no-cache不会携带. F5刷新是max-age=0来实现,而强制刷新(Ctrl+F5)是通过no-cache实现.  
异同: Expires是HTTP 1.0+的首部,用来指定一个绝对的过期日期,依赖客户端时间设置的准确性,缓存时间是相对服务器上的时间而言的.
max-age是HTTP/1.1的Cache-Control的一个字段,用来指定文档的最大使用时间.
  • 协商缓存
    释义: 客户端第一次问服务器要某个资源时,服务器丢还给客户端所请求的这个资源同时,将该资源的一些信息(文件摘要、或者最后修改时间)也返回给客户端,告诉客户端将这个资源缓存在本地.当客户端下一次需要这个资源时,将请求以及相关信息(文件摘要、或者最后修改时间)一并发送给服务器,由服务器来判断客户端缓存的资源是否需要更新:如不需要更新,就直接告诉客户端获取本地缓存资源;如需要更新,则将最新的资源连同相应的信息一并返回给客户端.

    Last-Modified & If-Modified-Since & Etag & If-None-Match

    • Last-Modidied & If-Modified-Since:

      • Last-Modified: 为实体首部字段,值为资源最后更新时间,随服务器response返回.
      • If-Modified-Since: 为请求首部字段,通过比较两个时间来判断资源在两次请求期间是否有过修改,如果没有修改,则命中协商缓存,浏览器从缓存中获取资源;如果有过修改,则服务器返回资源,同时返回新的Last-Modified时间.
    • Etag & If-None-Match:

      • Etag: 为相应头部字段,表示资源内容的唯一标识,随服务器response返回.
      • If-None-Match: 为请求头部字段,服务器通过比较请求头部的If-None-Match与当前资源的ETag是否一致来判断资源是否在两次请求之间有过修改,如果没有修改,则命中协商缓存,浏览器从缓存中获取资源;如果有过修改,则服务器返回资源,同时返回新的ETag.
  • 不能缓存的请求

    1. HTTP信息头中包含Cache-Control:no-cache,pragma:no-cache(HTTP1.0),或Cache-Control:max-age=0等告诉浏览器不用缓存的请求. Cache-Control: no-cache:这个很容易让人产生误解,使人误以为是响应不被缓存.实际上Cache-Control: no-cache是会被缓存的,只不过每次在向客户端(浏览器)提供响应数据时,缓存都要向服务器评估缓存响应的有效性.
    2. 需要根据Cookie,认证信息等决定输入内容的动态请求是不能被缓存的.
    3. 经过HTTPS安全加密的请求.
    4. POST请求无法被缓存.
    5. HTTP响应头中不包含Last-Modified/Etag,也不包含Cache-Control/Expires的请求无法被缓存.
  • 浏览器缓存机制示意图

浏览器缓存机制


至棣
109 声望3 粉丝