配置ETags
实体标签(ETags)是服务器和浏览器之前用来判断是否命中浏览器cache里的缓存内容的一种决策机制。(实体就是组件:图片,脚本,样式等。)ETags用来验证实体是否有效要比Last-Modified-Date头信息更加灵活。它是某一个版本组件的唯一标示,是字符串形式,需要用引号引起来。原始服务器在ETag头输出组件的ETag信息,例如:
HTTP/1.1 200 OK
Last-Modified: Tue, 12 Dec 2006 03:03:59 GMT
ETag: "10c24bc-4ab-457e1c1f"
Content-Length: 12195
后来,如果浏览器需要验证该组件,它就使用If-None-Match头把收到的ETag信息发送回原始服务器。如果ETag匹配上了,服务器就直接返回304状态码以节省开销,例如:
GET /i/yahoo.gif HTTP/1.1
Host: us.yimg.com
If-Modified-Since: Tue, 12 Dec 2006 03:03:59 GMT
If-None-Match: "10c24bc-4ab-457e1c1f"
HTTP/1.1 304 Not Modified
ETag通常是有组件在服务器上的属性组成的,这样让它们是唯一的,也是有一些问题的。如果浏览器在一台原始服务器上取得某一个组件和ETag信息,当它试图去另外一台服务器上验证该信息时往往时不能成功的。然而,眼下这样的用一组集群机器来做web服务器的情况时很普遍的。默认情况下,Apache和IIS嵌入在ETag中的数据极大地减少了验证测试的机会,而且是在多台服务器的情况下。
Apache1.3和2.x中用inode-size-timestamp的格式来表示ETag信息。在不同服务器上给定的一个在相同目录下的文件,可能有相同的大小,权限,时间戳,等等,但是不同服务器的inode信息是不同。
IIS5.0和6.0也有相同的问题。在IIS上ETag的格式是Filetimestamp:ChangeNumber。ChangeNumber是IIS本省配置文件的改变次数计数。在多台IIS服务器之间ChangeNumber也是不同的。
结论是,Apache或IIS对完全一样的组件所生成的ETag信息,在一台服务器上和其他服务器上是不同的。如果ETag不匹配,用户就无法收到304回复,反而产生普通的200响应并返回组件全部的内容。如果你只有一台服务器这没有问题。如果有多台服务器,并使用Apache或IIS的默认配置,这就是个问题。就算你设置了一个将来的Expires头信息,无论用户点击Reload还是Refresh仍然会产生条件GET请求。
如果你没有利用ETag提供的灵活的验证模式的话,最好还是把ETag配置整个去掉。Last-Modified头信息是基于组件的timestamp进行验证的。删除ETag可以减少本次响应和下次请求的HTTP头信息。微软支持有文章描述如何删除ETag。在Apache里,配置文件里面加一行:
FileETag none
阅读(1894) | 评论(0) | 转发(0) |