我的回答

在强缓存不作用的情况下, 会使用协商缓存

协商缓存分为两种:

  1. ETag和last-none-match, 指纹, 匹配文件是否修改
  2. last-modify和modify-since, 缓存过期时间

    参考答案

    协商缓存

    强缓存失效之后,浏览器在请求头中携带相应的缓存tag来向服务器发请求,由服务器根据这个tag来决定是否使用缓存,这就是协商缓存 具体来说,这样的缓存tag分为两种:Last-Modified和ETag。这两者各有优劣之分,并不存在谁对谁有绝对的优势

    Last-Modified

    最后的修改时间。在浏览器第一次给服务器发送请求时,服务器会在响应头中加上这个字段 浏览器接收到后,如果再次请求,会在请求头中携带if-Modified-Since字段,这个字段的值也就是服务器传来的最后修改时间 服务器拿到请求头中的If-Modified-Since的字段后,其实会和这个服务器中该资源的最后修改时间对比: 如果请求头中的这个值小于最后修改时间,说明是时候更新了。返回新的资源,跟常规的http请求响应的流程一样 否则返回304,告诉浏览器直接用缓存

    ETag

    ETag是服务器根据当前文件的内容,给文件生成的唯一标识,只要里面的内容有改动,这个值就会变。服务器通过响应头把这个值给浏览器。浏览器接收到ETag的值,会在下次请求时,将这个值作为If-None-Match这个字段的内容,并放到请求头中,然后发送给服务器 服务器接接收到If-None-Match后,会跟服务器上该资源的ETag进行对比: 如果两者不一样,说明要更新了。返回新的资源,跟常规的http请求响应的流程一样 否则返回304,告诉浏览器直接用缓存
    1. 两者对比:
    2. 1.在精准度上,ETag优于Last-Modified。优于ETag是按照内容给资源上标识,一次能准确感知资源的变化。而Last-Modified就不一样了,它在一些特殊的情况并不能准确感知资源变化,主要有两种情况
    3. 编辑了资源文件,但是文件内容并没有更改,这样也会造成缓存失效
    4. Last-Modified能够感知的单位时间是秒,如果文件在1秒内改变了多次,那么这时候的Last-Modified并没有体现出修改了
    5. 2.在性能上,Last-Modified由于ETag,也很简单理解,Last-Modified仅仅只是记录一个时间点,而ETag需要根据文件的具体内容生成哈希值
    6. 另外,如果两种方式都支持的话,服务器优先考虑ETag