大网站一般都是用F5或其它的负载均衡设备,用户的每次请求落在那台real server都是不一定的,一次偶然的机会,发现相同的一个资源在两次访问时,http头中的etag是不相同的,主要是该资源一定是没有被修改的,于是想到etag的算法中可能使用到了资源在不同real server上可能不同的因子,于是参考了一下apache的文档(因为我们使用的是apache),文档地址:
http://lamp.linux.gov.cn/Apache/ApacheMenu/mod/core.html#fileetag
默认情况下,etag和资源的inode有关系,而inode在不同的real server上基本是不相同的,于是,这样的etag还不如没有,因为这样该资源是每次都要返回全部信息的,可以修改apache配置文件,添加如下配置:
FileETag MTime Size
这样修改后,如果文件没有发生变化,则只需要返回304就行,不需要返回所有内容了。
如果不做这样的设置,对于使用f5的情况,etag或许还不如没有。
关于apache中etag的算法,可以参考源码: src/main/http_core.c 中的函数set_etag_bits
那么,你的apache是怎么配置的呢?随便访问一个能返回etag的资源,etag类似:
ETag: "1e50006-22d0-4ba718e6"
如果是“-”分隔的3部分,字基本是包含inode、mtime、size了,如果是两部分,那就是其中的两项了,注意,每一项产生的长短不是固定的,不能按照长短来分析。