详细见:https://www.cnblogs.com/moxiaotao/p/9670109.html
1.强缓存
原理:浏览器首次发出请求服务端会在response header加上Expires的header/Cache-Control。浏览器会将这个资源连同所有response header一起缓存下来(所以缓存命中的请求返回的header并不是来自服务器,而是来自之前缓存的header)。
再次请求这个资源时,会从缓存中找,如果是expires,再次请求的时间不超过expires的时间就能命中。如果是cache-control,第一次请求的时间+cache-control的有效时间,从而推算出缓存过期时间,此时再次请求的时间不超过缓存过期的时间就能命中,否则不能。
体现为:状态码200,F12里network下的size字段值对应为from cache。
2.协商缓存
当浏览器对某个资源的请求没有命中强缓存,就会发一个请求到服务器,验证协商缓存是否命中。
体现为:如果协商缓存命中,请求响应返回的http状态为304并且会显示一个Not Modified的字符串。
1)浏览器第一次跟服务器请求一个资源,服务器在返回这个资源的同时,在respone的header加上Last-Modified的header
2)浏览器再次跟服务器请求这个资源时,在request的header上加上If-Modified-Since的header。
3)服务器再次收到资源请求时,根据浏览器传过来If-Modified-Since和资源在服务器上的最后修改时间判断资源是否有变化,如果没有变化则返回304 Not Modified,但是不会返回资源内容;如果有变化,就正常返回资源内容。当服务器返回304 Not Modified的响应时,response header中不会再添加Last-Modified的header,因为既然资源没有变化,那么Last-Modified也就不会改变。