High Performance Web Sites Rule 13

Entity Tags

Entity Tags (ETags) 是 HTTP/1.1 的新特性。在 Conditional GET Requests 中起作用,是一个标识文件特定版本的标记。是除了最后修改时间以外,判断组件是否变化的另一种方式。 image 图1 Rule 3 提到的 If-Modified-Since 请求判断文件是否已修改 image image 图2 如果第一次请求时服务器返回了 ETags 那么每次的 Conditional GET Request 浏览器都会多一个 If-None_Match 请求头判断 ETags 是否改变

Etags 的问题

如果网站使用多个服务器,Apache 和 IIS 的默认配置都会导致不同服务器的同样文件有不同的 ETags,从而大大增加了不必要的流量。 此外,若 ETags 的优先级高于 Expire Header (本章没说清啥情况下 ETags 的优先级高于 Expire Header),则尽管遵循 Rule 3 为基本不改动的组件设了长 Expire Header ,访问者每次刷新还是会重新下载一次那个组件。很浪费有木有?

解决

要就充分利用 ETags 带来的灵活性,比如根据不同的浏览器给出不同的 ETags (例如谷歌就给中文和英文网站的资源不同的 Etags,可以想象到带来的维护上的方便性); 要么删掉 ETags 。 image