Cache-Control字段值详解

前端小伙伴们,不少时候会在工做中或者面试中碰见Cache-Control这个字段带来的功能,好比有时候会在面试中怎么实现强制缓存之类的。不要怕今天我们就看看Cache-Control的神秘之处。前端

单单一个通用的首部字段Cache-Control的值就有十几种,其中包含了请求首部可携带的和响应首部携带的。面试

我们先看看请求首部Cache-Control的值缓存

一、no-cache服务器

当客户端请求时携带这个首部字段的时候,经过中间的缓存服务器时,会不去拿缓存资源,而是让中间服务器转发给资源服务器,资源服务器看看一下这个资源过时没有,若是没有就会告知中间服务器,可使用缓存资源。不然资源服务器就会直接返回新的资源。网络

二、no-store设计

这个字段很是有意思,就是告知服务器或者客户端以及中间服务器,我请求或者响应的内容里面有机密信息,这些响应的内容是永远不会获得响应的。代理

三、max-agecode

max-age指令标示了客户端不肯意接收一个age大于设定时间的响应,这个字段表达是最大缓存时长,请求中单单添加这个字段,实现不了缓存时长,必须结合响应的max-age。一会,会在响应中的max-age 详细说明orm

四、max-stale token

这个指令表达的是缓存时长过时之后,还能够有效。好比如今max-age:60秒,那么max-stale:60秒,如今的缓存时长就是120秒,

五、min-fresh

设定可以容忍的最小新鲜度(缓存时长)min-fresh标示了客户端不肯意接受新鲜度很少于当前的age加上min-fresh设定的时间之和的响应。

六、no-transfrom

使用 no-transform 指令规定不管是在请求仍是响应中,缓存都不能改 变实体主体的媒体类型。

七、only-if-cache

使用 only-if-cached 指令表示客户端仅在缓存服务器本地缓存目标资源的状况下,才会要求其返回。换言之,该指令要求缓存服务器不从新加载响应,也不会再次确认资源有效性。若发生请求缓存服务器的本 地缓存无响应,则返回状态码 504 Gateway Timeout。

八、cache-extension

经过 cache-extension 标记(token),能够扩展 Cache-Control 首部字 段内的指令。


我们在看看请求首部Cache-Control的值

一、pulic

这个字段和private是相对的,Cache-Control: public时,则代表全部的用户在经过缓存服务器的时候,均可以缓存这个资源。

二、private

这个字段和pulic是相对的,Cache-Control: private时,则代表只有某个在经过缓存服务器的时候,获得缓存资源

三、no-cache

若是服务器返回的响应中包含 no-cache 指令,那么缓存服务器不能对 资源进行缓存。源服务器之后也将再也不对缓存服务器请求中提出的资 源有效性进行确认,且禁止其对响应资源进行缓存操做。

四、no-store

同请求首部的no-store指令同样

五、no-transfrom

同请求首部的no-transfrom指令同样

六、max-age

在Response中设置max-age的时间信息,能够在客户端生成缓存文件,在缓存不过时的状况下,客户端不会直接向服务器请求数据,在缓存过时的状况下,客户端会向服务器直接请求生成新的缓存。

若是同时设置了Response和Request中的max-age 缓存时间,若是Request中的max-age时间小于Response中的max-age时间,客户端会根据Request中max-age时间周期去直接进行网络请求,若是碰到断网或者网络请求不通的状况,即便缓存还在有效期内(Response中设置的max-age时间足够大),在Request设置的max-age过时以后,APP也会直接去进行网络请求。 所以能够考虑在客户端的设计中一个和好的网络缓存场景,用Response的max-age控制缓存的时间,用Request中max-age控制刷新的时间和机制

应用 HTTP/1.1 版本的缓存服务器遇到同时存在 Expires 首部字段的情 况时,会优先处理 max-age 指令,而忽略掉 Expires 首部字段。而 HTTP/1.0 版本的缓存服务器的状况却相反,max-age 指令会被忽略

七、s-max-age

和max-age相似,它们的不一样点是 s- maxage 指令只适用于供多位用户使用的公共缓存服务器 

八、must-revalidate

使用 must-revalidate 指令,代理会向源服务器再次验证即将返回的响 应缓存目前是否仍然有效。

若代理没法连通源服务器再次获取有效资源的话,缓存必须给客户端 一条 504(Gateway Timeout)状态码。

另外,使用 must-revalidate 指令会忽略请求的 max-stale 指令(即便已 经在首部使用了 max-stale,也不会再有效果)。

九、proxy-revalidate

proxy-revalidate 指令要求全部的缓存服务器在接收到客户端带有该指 令的请求返回响应以前,必须再次验证缓存的有效性。

十、cache-extension

同请求首部的cache-extension指令同样