如何设置
一般咱们会同时设置expires和cache-control两种,保证不管在http1仍是1.1的状况下都有效css
cache-controlhtml
http1.1新标准,包括这些属性:算法
(1)max-age:用来设置资源(representations)能够被缓存多长时间,单位为秒; (2)s-maxage:和max-age是同样的,不过它只针对代理服务器缓存而言; (3)public:指示响应可被任何缓存区缓存; (4)private:只能针对我的用户,而不能被代理服务器缓存; (5)no-cache:强制客户端直接向服务器发送请求,也就是说每次请求都必须向服务器发送。服务器接收到请求,而后判断资源是否变动,是则返回新内容,不然返回304,未变动。这个很容易让人产生误解,令人误觉得是响应不被缓存。实际上Cache-Control:no-cache是会被缓存的,只不过每次在向客户端(浏览器)提供响应数据时,缓存都要向服务器评估缓存响应的有效性。 (6)no-store:禁止一切缓存(这个才是响应不被缓存的意思)。
缓存的两种表现形式浏览器
来自于内存的数据,会随着进程的结束而清除,读取速度相对快(0ms)
通常存放脚本,图片,字体等文件缓存
来自于硬盘的数据,不会随着进程的结束而清除,读取速度慢于memory cache(2-10ms 硬盘读写的IO操做)
通常存放css文件服务器
根据经验状况来看:浏览器的实际处理逻辑是这样的性能
首次加载资源 -> 200 -> 关闭标签页
再次进入 -> 200 from disk cache -> 刷新 -> 200 from memory cache
(不过好像css都是from disk cache, base64都是from memory cache)字体
客户端向服务端发送请求时候(没有命中强制缓存),服务端会检查是否有对应的标识,没有则返回200并生成一个新的标识带到header,下次在请求的时候服务端检查到对应的这个标识并作相应的校验,经过则返回304,读取缓存。ui
浏览器首次请求资源的时候,服务器会返回一个last-Modify到header中. Last-Modify 含义是最后的修改时间。
当浏览器再次请求的时候,request header会带上 if-Modify-Since,该值为以前返回的 Last-Modify。服务器收到if-Modify-Since后,根据资源的最后修改时间(last-Modify)和该值(if-Modify-Since)进行比较,若是相等的话,则命中缓存,返回304,不然, 则会给出200响应,而且更新Last-Modify为新的值代理
last-modified这种方式精度差在哪里:
a. 一些文件也许会周期性的更改,可是他的内容并不改变(仅仅改变的修改时间),这个时候咱们并不但愿客户端认为这个文件被修改了
b. 某些文件修改很是频繁,好比在秒如下的时间内进行修改,(比方说1s内修改了N次),If-Modified-Since能检查到的粒度是s级的,这种修改没法判断(或者说UNIX记录MTIME只能精确到秒);
<meta http-equiv="Cache-control" content="no-cache, no-store, must-revalidate"> <!-- http1.1标准 --> <meta http-equiv="Pragma" content="no-cache"> <!-- http1.0标准 -->