一。背景介绍
浏览器缓存是为了节约网络的资源加载速度,浏览器在用户磁盘上对最近所请求过的文档进行存储,当用户再次请求这个页面时,浏览器直接从用户磁盘显示文档,这样就可以加速页面的加载。浏览器缓存主要有两类:缓存协商:Last-modified,Etag和彻底缓存:cache-control,Expires。
二。知识剖析
1.强缓存
服务器通过设置http中的header的Expires和cach-control字段告诉浏览器缓存的有效期
Expires是Web服务器响应消息头字段,在响应http请求时告诉浏览器在过期时间前浏览器可以直接从浏览器缓存取数据,而无需再次请求。
Expires的值是GMT格式的绝对时间,在设置的时间前浏览器会直接使用本地缓存。
cache-control有12个值,其中的max-age值定义缓存的有效期,单位是秒,例如:cach-control:max-age=700,它表示缓存有效期为700秒,以消息的生成日期为基准,也就是header中的Date字段。
cache-control与Expires的区别在于cache-control的值是相对时间,而Expires是绝对时间,如果我们人为的修改了本地的时间,那么此时本地的时间与服务器上的时间不一致,就会导致缓存不能正确得被使用;而如果用相对时间,不管怎么改变本地时间,缓存的有效期都不会改变。
2.协商缓存
简单地说,协商缓存就是通过服务器来判断缓存是否可用。
Last-Modified:表示这个响应资源的最后修改时间,web服务器在响应请求时,告诉浏览器资源的最后修改时间。
If-Modified-Since:当资源过期时(使用cache-control标识的max-age),发现资源具有Last-Modified声明,则再次向web服务器请求时带上If-Modified-Since,表示请求时间。web服务器收到请求后发现有头If-Modified-Since则与被请求资源的最后修改时间进行对比。若最后修改时间较新,说明资源又被改动过,则响应整片资源内容(写在相应消息包体内),HTTP 200;若最后修改时间较旧,说明资源无新修改,则响应HTTP304(无需包体,节省浏览),告知浏览器继续使用所保存的cache。
Etag/If-None-Match
Etag/If-None-Match也要配合Cache-Control使用。
Etag:web服务器响应求时,告诉浏览器当前资源在服务器的唯一标识(生成规则由服务器决定)。Apache中,Etag的值,默认是对文件的索引节(INode),大小(Size)和最后修改时间(MTime)进行Hash后得到的。
If-None-Match:当资源过期时(使用Cache-Control表示的max-age),发现资源具有Etag声明,则再次向web服务器请求时带上头If-None-Match(Etag的值)。web服务器收到请求后发现有头If-None-Match则与被请求资源的相应校验串进行对比,决定返回200或304。
三。常见问题
Q:Etag与Last-Modified有什么区别?
A:Etag更倾向于标识资源是否有变更,而Last-Modified更倾向于含有时间状态的数据
Q:如果Etag和Last-Modified同时存在,服务器会先检测哪一个?
A:服务器会先检测Etag再去检测Last-Modified,因为Etag发生改变的话那么资源的内容一定发生了变化,而Last-Modified发生了变化资源内容不一定发生改变
Q:cache-control和Expries的区别?
A:cache-control用于控制HTTP缓存,Expires表示存在时间,允许客户端在这个时间之前不去发请求,等同于max-age的效果。但是如果同时存在,则被cache-control的max-age覆盖。