(1)触发条件: Cache-Control 的值为 no-cache (不强缓存)或者 max-age 过期了 (强缓存,但总有过期的时候),也就是说不管怎样,都可能最后要进行协商缓存(no-store除外)。 (2)解释名词: ETag:每个文件有一个,改动文件了就变了。Last-Modified:文件的修改时间。 (3)工作机制: 浏览器向浏览器缓存表请求数据,每次http返回来 response header 中的 ETag和 Last-Modified,在下次请求服务器时在 request header 就把这两个带上(但是名字变了ETag–>If-None-Match,Last-Modified–>If-Modified-Since ),服务端把你带过来的标识,资源目前的标识,进行对比,然后判断资源是否更改了,如果资源没更改,返回304,浏览器读取本地缓存;如果资源有更改,返回200,返回最新的资源。这个过程是循环往复的,即缓存表在每次请求成功后都会更新规则。 【1】协商缓存,服务器资源未改动: 1、浏览器向浏览器缓存表请求a.js; 2、浏览器缓存数据表命中了协商缓存,给你一个ETag=111,Last-Modified=2018.6.3; 3、浏览器请求后端服务器并且在request.header中,加入If-None-Match=111,If-Modified-Since=2018.6.3; 4、后端服务器告诉浏览器服务端的该资源并未修改,直接读本地缓存就行,返回的是状态码是304; 5、浏览器向浏览器缓存数据表请求,从本地缓存中读取资源。
【2】协商缓存,服务器资源改动了: 1、浏览器向浏览器缓存表请求a.js; 2、浏览器缓存数据表命中了协商缓存,给你一个ETag=111,Last-Modified=2018.6.3; 3、浏览器请求后端服务器并且在request.header中,加入If-None-Match=111,If-Modified-Since=2018.6.3; 4、后端服务器告诉浏览器服务端该资源有修改,并且返回新的资源(状态码为200),且新规则为ETag=112,Last-Modified=2018.6.8; 5、浏览器将新规则ETag=112,Last-Modified=2018.6.8存入浏览器缓存数据表中。
|