缓存验证指当响应的资源做出了改变时,服务器与缓存之间的通信所使用的验证。通过这种验证,如果在本地已有一份拷贝资源,缓存就可以避免下载整个资源文件。
验证器十分重要:假如没有它,就没有更新的报头(Expires or Cache-Control), 缓存将无法存储响应资源.大多数的验证程序是记录了资源最后一次修改的时间(报头参数中的Last-Modified),当缓存保存了包含参数Last-Modified的响应资源时,它将使用一个包含参数If-Modified-Since的请求与服务器上资源的最后修改时间做对比,以查看资源是否已作出改变。
HTTP 1.1 协议同时引入一个新的验证器,名为Etag。这种验证器拥有特殊的标示符,它来自于服务器,并且随着响应资源的改变而改变。简单点即 服务器响应时给请求URL标记,并在HTTP响应头中将其传送到客户端,在Http响应头中包含 Etag:“5d8c72a5edda8d6a:3239”标识,等于告诉客户端,你拿到的这个的资源有表示 ID:5d8c72a5edda8d6a:3239。当下次需要发Request索要同一个URI的时候,浏览器同时发出一个If-None-Match 报头(Http RequestHeader)此时包头中信息包含上次访问得到的,即Etag:“2c8c72a5edda8d6a:3239”标识:
If-None-Match:"2c8c72a5edda8d6a:3239"
这样,客户端等于Cache了两份,服务器端就会比对2者的Etag。如果If-None-Match为False,返回304(缓存读取) ,不返回200(服务器读取)。
几乎所有的缓存都是使用了 Last-Modified作为验证器,而Etag有更高的优先权。大多数的网站服务器将自动产生 ETag 及 Last-Modified作为静态内容的验证器(i.e., files);你不需要做任何改变。但是,对于动态内容(像CGI、PHP、asp之类)却毫无作用。