分为强缓存和协商缓存;如果命中强缓存不会向服务器发送请求,如果没有命中强缓存,再发送请求头,看是否命中协商缓存,命中服务器返回304,浏览器在自己缓存中获取,如果没有命中协商缓存(缓存过期了),服务器会返回200,并返回新的过期时间和请求数据;

强缓存

expires和catch-control
  1. expires是服务器生成的时间,会不准确;
  2. catch-control有很多值,比如no-store:禁止缓存;no-catch禁止在与服务器进行新鲜度再验证之前,采用缓存内容;max-age=100:缓存多久,相对时间;

    协商缓存

    last-modified/if-modified-since
    最后修改的日期;服务器生成last-modified,放入响应头中,浏览器拿到数据。存入缓存,并记下日期,浏览器再次有该请求时,会先看是否有last-modified字段,会在请求头中加上if-modified-since=上次服务器给的last-modified时间,发送给服务器,服务器校验是否过期,如果这个时间<服务器中最后一次被定义地时间,则过期,服务器会返回200状态码,并返回最新的数据和生成最新的last-modified;如果没有过期,返回304状态码,浏览器从自己的缓存获取数据;
    etag/if-none-match
    服务器生成etag,是一个根据数据内容生成的特殊标识,和last-modified一样。浏览器再次有同样的请求时,会先看看是否有etag,如果有,携带if-none-match=上次服务器给的etag标识的请求头,发送给服务器验证,所请求的数据是否标识改变,服务器判断,如果改变,返回200状态码,新数据和新的etag,如果没有更改,返回304状态码,浏览器从自己的缓存中获取数据。
    区别
    expires是服务器生成的日期,可能不准确,在http1.1版本新增了catch-control,优先级更高。
    last-modified是秒级的时间,而有些数据内容可能更新时间小于秒,这会导致不能获取最新数据;有些数据是周期性生成,但内容并没有改变,时间检测更新会浪费资源;etag是服务器根据数据内容生成的唯一标识,可以解决;etag是http1.1版本新增,优先级更高;