Chinaunix首页 | 论坛 | 博客
  • 博客访问: 133049
  • 博文数量: 57
  • 博客积分: 2500
  • 博客等级: 少校
  • 技术积分: 580
  • 用 户 组: 普通用户
  • 注册时间: 2008-06-04 22:57
文章分类

全部博文(57)

文章存档

2011年(1)

2010年(1)

2009年(55)

我的朋友

分类: 系统运维

2009-09-24 17:45:56

配置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
阅读(1840) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~