高性能网站建设指南(十三)配置ETag
in Blog
减少呈现页面时必须的HTTP请求数量是加速用户体验的最佳方式。可以通过最大化浏览器缓存组件的能力来实现这一目标,但当网站被宿主在多于一台服务器上时,ETag头可能会阻碍缓存。
ETag是什么?(What’s 按ETag?)
实体标签(Entity Tag,ETag)是Web服务器和浏览器用于确认缓存组件有效性的一种机制。
实体标签(Entity Tags)
ETag提供了另一种方式,用于检测浏览器缓存中的组件与原始服务器上的组件是否匹配。
ETag在HTTP1.1中引入,是唯一标识了一个组件的一个特定版本的字符串。唯一的格式约束是该字符串必须用引号引起来。原始服务器使用ETag响应头来指定组件的ETag。
ETag的加入为验证实体提供了比最新修改日期更为灵活的机制。如果浏览器必须验证一个组件,它会使用If-None-Match头将ETag传回原始服务器。
ETag带来的问题(The Problem with ETags)
ETag的问题在于,通常使用组件的某些属性来构造它,这些属性对于特定的、寄宿了网站的服务器来说是唯一的。当浏览器从一台服务器上获取了原始组件,之后,又向另一台不同的服务器发起条件GET请求时,ETag是不会匹配的——而对于使用度武器集群来处理请求的网站来说,这是很常见的一种情况。默认情况下,对于拥有多台服务器的网站,APache和IIS向ETag中嵌入的数据都会大大地降低有效性验证的成功率。
对组件进行不必要的重新加载还会影响度武器的性能并增加带宽开销。
ETag还降低了代理缓存的效率。
If-None-Match比If-Modified-Since具有更高的优先级。
ETag——用还是不用(ETags:use’Em or Lose’Em)
如果你的组件必须通过最新修改日期之外的一些东西来进行验证,则ETag是一种强大的方法。
如果你无须自定义ETag,最好简单地将其移除。只留下大小和时间戳作为组件的ETag。然而,这些信息都是重复的,所以将ETag完全移除——Last-Modified头可以提供完全等价的信息,而且移除ETag可以减少响应和后续请求的HTTP头大小。