缓存分析:
浏览器向服务器发起http请求,服务器响应该请求,在浏览器拿到服务器返回会的数据后,会根据响应报文的http头的缓存标识,决定结果是否缓存,,是则将结果和缓存标识存入浏览器缓存中
浏览器每次请求都会先在浏览器缓存中查找缓存结果和缓存标识
浏览器每次拿到返回结果都会将该结果和缓存标识存入浏览器缓存
缓存过程分为强缓存和协商缓存
强缓存就是不向服务器请求数据,而是直接从浏览器缓存中获取数据,如果有,则直接获取,否则还是要向服务器请求
但在获取浏览器缓存之前要判断该缓存是否失效,缓存到期时间存放在expires中;浏览器会将本地时间和该时间对比,判断资源是否过期;但如果我们手动改变电脑时间呢,这就需要cache-control,它的优先级比expires高
cache-control取值有:
- public:所有内容都将被缓存(客户端和代理服务器都可缓存)
- private:所有内容只有客户端可以缓存,Cache-Control的默认值
- no-cache:客户端缓存内容,但是是否使用缓存则需要经过协商缓存来验证决定
- no-store:所有内容都不会被缓存,即不使用强制缓存,也不使用协商缓存
- max-age=xxx:缓存内容将在xxx秒后失效
- s-maxage:代理服务器的资源过期时间
- immutable:就算过期了也不用协商,资源就是不变的
- max-stale=xxx:过期了xxx秒内,资源也能用
- stale-while-revalidate:在验证(协商)期间,返回过期的资源
- stale-if-error:验证(协商)出错的话,返回过期的资源
- must-revalidate:不允许过期了还用过期资源,必须等协商结束
控制强制缓存的字段expires和cache-control都是存放在http响应报文的http头中和响应结果一起返回浏览器
协商缓存是在强缓存失效后,浏览器携带缓存标识向服务器请求,由服务器决定是否使用缓存的过程
协商缓存生效,返回304
协商缓存失效,返回200和请求结果
同样,协商缓存的标识也是在响应报文的HTTP头中和请求结果一起返回给浏览器的,控制协商缓存的字段分别有:Last-Modified / If-Modified-Since和Etag / If-None-Match,其中Etag / If-None-Match的优先级比Last-Modified / If-Modified-Since高。
Last-Modified / If-Modified-Since
Last-Modified是服务器响应请求时,返回该资源文件在服务器最后被修改的时间;
If-Modified-Since则是客户端再次发起该请求时,携带上次请求返回的Last-Modified值,通过此字段值告诉服务器该资源上次请求返回的最后被修改时间。服务器收到该请求,发现请求头含有If-Modified-Since字段,则会根据If-Modified-Since的字段值与该资源在服务器的最后被修改时间做对比,若服务器的资源最后被修改时间大于If-Modified-Since的字段值,则重新返回资源,状态码为200;否则则返回304,代表资源无更新,可继续使用缓存文件。
Etag / If-None-Match
Etag是服务器响应请求时,返回当前资源文件的一个唯一标识(由服务器生成);
If-None-Match是客户端再次发起该请求时,携带上次请求返回的唯一标识Etag值,通过此字段值告诉服务器该资源上次请求返回的唯一标识值。服务器收到该请求后,发现该请求头中含有If-None-Match,则会根据If-None-Match的字段值与该资源在服务器的Etag值做对比,一致则返回304,代表资源无更新,继续使用缓存文件;不一致则重新返回资源文件,状态码为200
总结
强制缓存优先于协商缓存进行,若强制缓存(Expires和Cache-Control)生效则直接使用缓存,若不生效则进行协商缓存(Last-Modified / If-Modified-Since和Etag / If-None-Match),协商缓存由服务器决定是否使用缓存,若协商缓存失效,那么代表该请求的缓存失效,重新获取请求结果,再存入浏览器缓存中;生效则返回304,继续使用缓存。
标签:返回,缓存,http,请求,讲讲,Modified,服务器,浏览器 From: https://www.cnblogs.com/qianduan-Wu/p/16753889.html