有些数据随时都在变化。 CNN.com 的主页常常几分钟就更新。另外一方面,Google.com 的主页几个星期才更新一次 (当他们上传特殊的假日 logo,或为一个新服务做广告时)。 Web 服务是不变的:一般服务器知道你所请求的数据的最后修改时间,而且 HTTP 为服务器提供了一种将最近修改数据连同你请求的数据一同发送的方法。浏览器
若是你第二次 (或第三次,或第四次) 请求相同的数据,你能够告诉服务器你上一次得到的最后修改日期:在你的请求中发送一个 If-Modified-Since 头信息,它包含了上一次从服务器连同数据所得到的日期。若是数据从那时起没有改变,服务器将返回一个特殊的 HTTP 状态代码 304,这意味着 “从上一次请求后这个数据没有改变”。这一点有何进步呢?当服务器发送状态编码 304 时,再也不从新发送数据。您仅仅得到了这个状态代码。因此当数据没有更新时,你不须要一次又一次地下载相同的数据;服务器假定你有本地的缓存数据。缓存
全部现代的浏览器都支持最近修改 (last-modified) 的数据检查。若是你曾经访问过某页,一天后从新访问相同的页时发现它没有变化,并奇怪第二次访问时页面加载得如此之快——这就是缘由所在。你的浏览器首次 访问时会在本地缓存页面内容,当你第二次访问,浏览器自动发送首次访问时从服务器得到的最近修改日期。服务器简单地返回 304: Not Modified (没有修改),所以浏览器就会知道从本地缓存加载页面。在这一点上,Web 服务也如此智能。服务器
ETag 是实现与最近修改数据检查一样的功能的另外一种方法:没有变化时不从新下载数据。其工做方式是:服务器发送你所请求的数据的同时,发送某种数据的 hash (在 ETag 头信息中给出)。hash 的肯定彻底取决于服务器。当第二次请求相同的数据时,你须要在 If-None-Match: 头信息中包含 ETag hash,若是数据没有改变,服务器将返回 304 状态代码。与最近修改数据检查相同,服务器仅仅 发送 304 状态代码;第二次将不为你发送相同的数据。在第二次请求时,经过包含 ETag hash,你告诉服务器:若是 hash 仍旧匹配就没有必要从新发送相同的数据,由于你还有上一次访问过的数据。ui
这几个http头能够做为meta标签发送到客户端,可是须要注意的是Http头中的设置优先级更高一些,例如:
<meta. http-equiv=”Expires” CONTENT=” Fri, 30 Oct 1998 14:19:41″>
<meta. http-equiv=”Cache-Control” CONTENT=”no-cache”>编码