本文将介绍http中强制缓存和协商缓存的区别前端
浏览器缓存(Brower Caching)是浏览器对以前请求过的文件进行缓存,以便下一次访问时重复使用,节省带宽,提升访问速度,下降服务器压力浏览器
http缓存机制主要在http响应头中设定,响应头中相关字段为Expires、Cache-Control、Last-Modified、Etag。缓存
HTTP 1.0协议中的。简而言之,就是告诉浏览器在约定的这个时间前,能够直接从缓存中获取资源(representations),而无需跑到服务器去获取。服务器
另:网络
第一次请求:工具
浏览器缓存分为强缓存和协商缓存spa
200 form memory cache : 不访问服务器,通常已经加载过该资源且缓存在了内存当中,直接从内存中读取缓存。浏览器关闭后,数据将不存在(资源被释放掉了),再次打开相同的页面时,不会出现from memory cache。3d
200 from disk cache: 不访问服务器,已经在以前的某个时间加载过该资源,直接从硬盘中读取缓存,关闭浏览器后,数据依然存在,此资源不会随着该页面的关闭而释放掉下次打开仍然会是from disk cache。代理
优先访问memory cache,其次是disk cache,最后是请求网络资源code
强缓存:
Expires:过时时间,若是设置了时间,则浏览器会在设置的时间内直接读取缓存,再也不请求
Cache-Control:当值设为max-age=300时,则表明在这个请求正确返回时间(浏览器也会记录下来)的5分钟内再次加载资源,就会命中强缓存。
cache-control:除了该字段外,还有下面几个比较经常使用的设置值:
(1) max-age:用来设置资源(representations)能够被缓存多长时间,单位为秒;
(2) s-maxage:和max-age是同样的,不过它只针对代理服务器缓存而言;
(3)public:指示响应可被任何缓存区缓存;
(4)private:只能针对我的用户,而不能被代理服务器缓存;
(5)no-cache:强制客户端直接向服务器发送请求,也就是说每次请求都必须向服务器发送。服务器接收到 请求,而后判断资源是否变动,是则返回新内容,不然返回304,未变动。这个很容易让人产生误解,令人误 觉得是响应不被缓存。实际上Cache-Control: no-cache是会被缓存的,只不过每次在向客户端(浏览器)提供响应数据时,缓存都要向服务器评估缓存响应的有效性。
(6)no-store:禁止一切缓存(这个才是响应不被缓存的意思)。
复制代码
cache-control是http1.1的头字段,expires是http1.0的头字段,若是expires和cache-control同时存在,cache-control会覆盖expires,建议两个都写。
协商缓存:
Last-Modifued/If-Modified-Since和Etag/If-None-Match是分别成对出现的,呈一一对应关系
Etag:
Etag是属于HTTP 1.1属性,它是由服务器(Apache或者其余工具)生成返回给前端,用来帮助服务器控制Web端的缓存验证。 Apache中,ETag的值,默认是对文件的索引节(INode),大小(Size)和最后修改时间(MTime)进行Hash后获得的。
If-None-Match:
当资源过时时,浏览器发现响应头里有Etag,则再次像服务器请求时带上请求头if-none-match(值是Etag的值)。服务器收到请求进行比对,决定返回200或304
Last-Modified:
浏览器向服务器发送资源最后的修改时间
If-Modified-Since:
当资源过时时(浏览器判断Cache-Control标识的max-age过时),发现响应头具备Last-Modified声明,则再次向服务器请求时带上头if-modified-since,表示请求时间。服务器收到请求后发现有if-modified-since则与被请求资源的最后修改时间进行对比(Last-Modified),若最后修改时间较新(大),说明资源又被改过,则返回最新资源,HTTP 200 OK;若最后修改时间较旧(小),说明资源无新修改,响应HTTP 304 走缓存。
- Last-Modifued/If-Modified-Since的时间精度是秒,而Etag能够更精确。
- Etag优先级是高于Last-Modifued的,因此服务器会优先验证Etag
- Last-Modifued/If-Modified-Since是http1.0的头字段