Tag Archives: apache

深入了解Etag

给各位同学,补充下基础知识

本期,我们讲etag  (Entity tags)

 

Etag,也叫做实体标签,是http1.1协议的一部分,顾名思义,就是标识实体的一个字符串,因为是

标识,所以唯一性,也是etag需要解决的问题。这里面所谓的实体(Entity)

包括图片、script脚本,样式表,文档等等。

 

Etag存在的意义,在于提供一种机制,验证浏览器是否在已经cache了服务器端的实体。

 

因此,eTag从本质上说,提供了一种实体验证机制,比last-modified更加灵活。

 

下面的例子,说明了Etag工作的流程

一个GET 

Request Headers

Host 192.168.1.39:81

User-Agent Mozilla/5.0 (Windows; U; Windows NT 5.1; zh-CN; rv:1.9.0.4) Gecko/2008102920 Firefox/3.0.4

Accept image/png,image/*;q=0.8,*/*;q=0.5

Accept-Language zh-cn

Accept-Encoding gzip,deflate

Accept-Charset gb2312,utf-8;q=0.7,*;q=0.7

Keep-Alive 300

Connection keep-alive

Referer http://192.168.1.39:81/frame.php?frameon=yes&referer=http%3A//192.168.1.39%3A81/

If-Modified-Since Wed, 17 Dec 2008 08:12:18 GMT

If-None-Match “125835640”

Cache-Control max-age=0

 


Response Headers

Expires Thu, 22 Jan 2009 07:14:08 GMT

Cache-Control max-age=2592000

Content-Type image/gif

Accept-Ranges bytes

Etag “125835640”

Last-Modified Wed, 17 Dec 2008 08:12:18 GMT

Date Tue, 23 Dec 2008 07:14:08 GMT

Server lighttpd/1.4.20

HTTP/1.1 304 Not Modified   

 

客户端发起Get请求,请求里面包含了

If-Modified-Since    用来标识实体的最后修改时间

If-None-Match 用来向服务器端,传递etag

 

服务器端,拿到etag后,比较一下,资源是否更新,如果

没有更新,那么直接返回304

 

so,一切看起来很完美,etag也是标准协议的一部分。

那么,事情真的这么美好吗?

 

问题出在etag的计算方式上

apache 1,2.x都是通过文件系统的inode-size-timestamp来计算的

iis,通过Filetimestamp:ChangeNumber 来计算的(changeNumber是iis服务器变更配置文件的次数)

 

那么我们现在的网站,都做了Load balance,就是用户请求会在

不同的服务器之间切换,问题出来了,因为计算方式的问题,部署

在不同服务器上面的文件的etag是不一样的,所以,即使客户端缓存了

资源实体,在负载均衡系统切换不同的服务器的时候,也会造成额外的200请求,而非

304请求。


解决方案:

    在apache配置文件里面,增加FileETag none,通过mod_expire来做失效控制

    在IIS下面 参考 http://support.microsoft.com/?id=922733  

 

额外的好处:

    少了Etag,节约了网络带宽,流量,尤其是在采用负载均衡的情况下