浏览器缓存跟服务器有一个约定规则,工作规则很简单:检测以确保副本是最新的。浏览器会在硬盘专门开辟一个空间存储资源副本作为缓存。比如我们后台的系统,如果想记住上一步操作内容,避免用户返回上一个页面的时候页面内容被刷没了。这时候这个页面缓存起到绝对的人性化。
浏览器缓存分HTTP1.0和HTTP1.1,1.1引入了e-tag实体标签。
对象更新校验方式:
HTTP通过两种方式验证对象是否有更新if-non-match 和 if-modified-since。通过在Request中包含上述在请求头header向服务器发起询问。当response中包含e-tag头时,浏览器应该使用if-non-match来询问;response中含有last-modified头时,浏览器应用if-modified-since来进行更新询问。当服务器同时使用E-tag和last-modified时,浏览器应同时发送if-non-match和if-modified-since头,服务器应同时对这两个头进行确认,只有同时符合未更新条件方可返回304响应。
Cache控制:
用在request中的cache请求头
Pragma: no-cache :兼容早起HTTP协议版本 如1.0+
Cache-Control: no-cache ,表示不希望得到一个缓存内容。只是希望,cache设备可能忽略。
Cache-Control: no-store,表示client与server之间的设备不能缓存响应内容,并应该删除已有缓存。
Cache-Control: only-if-cached,表示只接受是被缓存的内容
用在response中控制cache的头
Cache-Control: max-age=3600,用相对于接收到的时间开始可缓存多久
Cache-Control: s-maxage=3600,与上面类似,只是s-maxage一般用在cache服务器上,并只对public缓存有效
Expires: Fri, 05 May 2018, 11:45:00 GMT 基于GMT的时间,绝对时间,但该头容易受到本地错误时间影响
Cache-Control: must-revalidate 该头表示内容可以被缓存但每次必须询问是否有更新。
各种cache-control头值和意义:
last-modified/e-tag 和cache-control/expires作用不一样,如果检测到本地的缓存在有效期内,直接使用本地缓存。两者要是一起使用,cache-control/expires优先级高于last-modified/e-tag ,这两者可以一起使用,利用服务器返回码304的配合,从而减少响应的开销,提高性能。