浏览器的网络请求304的缓存问题

1、http请求时浏览器先看本地缓存有没有该文件,没有文件就直接发起http请求获取最新js、html等文件。(缓存里面有该文件且没有过期直接使用本地缓存,谁都不商量,所以叫强制缓存)。
2、本地缓存如果过期了的话就去问一下服务器请求的该文件有没有修改,没有修改就返回304继续使用本地缓存,同时更新一下本地缓存的过期时间(Expires和Cache-Control),修改的话返回200获取新文件。(问一下服务器要不要使用本地缓存,所以叫协商缓存)

协商缓存和强制缓存可以同时使用。

浏览器的网络请求304的缓存问题_第1张图片

强制缓存:有两个规则判定有没有过期。
Expires和Cache-Control,Cache-Conctrol的优先级比Expires高。
Expires利用的是过期时间,其值为服务器返回该请求的结果缓存的到期时间,即再次发送请求时,如果客户端的时间小于缓存中的Expires的值时,直接使用缓存结果。
Cache-Control利用的是相对时间,当Cache-Control为max-age=600,意思就是说在600秒内再次发起该请求,则会直接使用缓存结果,强制缓存生效。
注:这两个时间是服务器返回来的。

协商缓存:有两个规则判定服务器资源有没有更新。
Etag / If-None-Match的优先级比Last-Modified / If-Modified-Since高。
Last-Modified / If-Modified-Since,由文件的最后更新时间来决定这个文件是否更新。服务器通过Last-Modified 返回给前端,前端请求相同资源的时候使用If-Modified-Since返回给后端。所以Last-Modified值 === If-Modified-Since值。
Etag / If-None-Match,由文件的唯一哈希值来决定这个文件是否更新。服务器通过返回Etag 给浏览器存起来,浏览器再次发起请求时会把这个Etag 值赋值给 If-None-Match送回去,服务器在判断一下是否相等从而判断文件是否已经被修改,同理 Etag值 === If-None-Match值。

总结:
1、强制缓存就看本地文件的约定时间有没有过期,协商缓存就是看服务器文件有没有修改。因为本地缓存可能过期了(服务器定的过期时间),但是服务器上的资源也没有修改,所以也没必要重新返回新文件。

你可能感兴趣的:(http)