Http header Etag

来源:互联网 发布:永硕e盘 易语言 源码 编辑:程序博客网 时间:2024/05/16 05:49

From:ETAG

此文详细说明了ETAG的作用。我发现网上很多人都在询问ETAG的对于优化网站的作用,有些人直接建议关闭ETAG。这篇博文可以完整的说明ETAG的作用,是否关闭,或者如何配置,要根据自己网站的情况而定。

开始ETAG测试

首先在浏览器输入以下访问地址
比如我们访问某网站:http://xxxxxxxx/
第一次的http请求代码如下(只包含头部信息)
———————————————————-
CODE:
GET / HTTP/1.1
Host: xxxxxxxx
User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.0; ja; rv:1.8.1.3) Gecko/20070309 Firefox/2.0.0.3
Accept: text/xml,application/xml,application/xhtml+xml,text/html;q=0.9,text/plain;q=0.8,image/png,*/*;q=0.5
Accept-Language: ja,en-us;q=0.7,en;q=0.3
Accept-Encoding: gzip,deflate
Accept-Charset: Shift_JIS,utf-8;q=0.7,*;q=0.7
Keep-Alive: 300
Connection: keep-alive

———————————————————-

服务器的返回http头部内容:
———————————————————-
CODE:
HTTP/1.x 200 OK
Date: Mon, 07 May 2011 11:49:33 GMT
Server: Apache/2.2.4 (Unix)
Last-Modified: Sat, 20 Nov 2009 20:16:24 GMT
Etag: “4c602bd-2c-4c23b600″
Accept-Ranges: bytes
Content-Length: 44
Connection: close
Content-Type: text/html

再次refresh,重新访问http://xxxxxxxx/

———————————————————-
第二次的请求http头内容如下
———————————————————-
CODE:
GET / HTTP/1.1
Host: xxxxxxxx
User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.0; ja; rv:1.8.1.3) Gecko/20070309 Firefox/2.0.0.3
Accept: text/xml,application/xml,application/xhtml+xml,text/html;q=0.9,text/plain;q=0.8,image/png,*/*;q=0.5
Accept-Language: ja,en-us;q=0.7,en;q=0.3
Accept-Encoding: gzip,deflate
Accept-Charset: Shift_JIS,utf-8;q=0.7,*;q=0.7
Keep-Alive: 300
Connection: keep-alive
If-Modified-Since: Sat, 20 Nov 2004 20:16:24 GMT
If-None-Match: "4c602bd-2c-4c23b600"
Cache-Control: max-age=0

———————————————————-
此时的http响应头如下
———————————————————-
CODE:
HTTP/1.x 304 Not Modified
Date: Mon, 07 May 2011 11:51:27 GMT
Server: Apache/2.2.4 (Unix)
Connection: close
Etag: “4c602bd-2c-4c23b600″

———————————————————-

以上的交互过程中有几个头部信息特别需要关注:

1)初次的http请求信息,收到的返回信息里面有个Etag标志

CODE:

Etag: “4c602bd-2c-4c23b600″

2)第二次请求的http信息

CODE:

If-None-Match: “4c602bd-2c-4c23b600″

3)第二次访问的响应http信息

CODE:

HTTP/1.x 304 Not Modified

Etag: “4c602bd-2c-4c23b600″

 

 

ETag被用在为了节省网络带宽进行缓存判断的机制上,Apache默认采用文件的inode,size,最终修改时间(mtime来生成Etag)。Apache允许关闭Etag功能,只要配置FileETag None 即可。

也就是说对Apache 请求静态内容(html网页、图片、css、javascript文件等)时候,Apache会按照请求文件的inode,大小,以及最终的修改时间来生成Etag的内容,并且包含在http的响应头部信息返回给客户端。

当浏览器访问网页的时候,会在http请求头中加入If-None-Match头部信息(前提是前次请求时服务器返回了Etag头部信息),内容是以前服务器发送回来的Etag信息。Apache收到该请求后,比较接收到的Etag和自己再次计算出的etag内容,如果两者相等,则返回“304 Not Modified”,如果不相等,则返回 200 OK和实际请求的内容。

注意这个时候If-None-Match相比于If-Modified-Since具有更高的优先级别。

如果ETag被关闭,服务器将使用If-Modified-Since参数来判断页面是否有更新,浏览器的If-Modified-Since参数来自原服务器上一次响应报文中的Last-Modified参数,这个参数精确到秒,也就是说,如果出现1秒内页面被多次修改,使用这个参数就无法判断,这就是要增加ETag的原因。

多台服务器负载均衡的情况

在web服务器只有一台的情况,请求内容的唯一性可以由Etag来确定,但是如果是多台web服务器在负载均衡设备下提供对外服务,尽管各web服务器上的组件内容完全一致,但是由于在不同的服务器上inode是不同的,因此对应生成的Etag也是不一样的。在这种情况下,尽管请求的是同一个未发生变化的组件,但是由于Etag的不同,导致Apache服务器不再返回「“304 Not Modified”,而是返回了200 OK和实际的组件内容(尽管事实上内容不曾发生变化),大大浪费了带宽。

例如:一个在load balancer(负载平衡)下的web服务器群,同一浏览器来的多次访问被轮询分配到不同的服务器上,因此每次都得到不同的Etag,从而导致客户端每次都要从服务器端接收原本已经在客户端缓存的内容,徒然浪费了服务器端宝贵的带宽资源。

一些解决办法

Etag的生成因素限制为:Inode,文件大小和最后修改时间 (mtime)

CODE:
FileETag INode MTime Size
或者:FileETag All

不让服务器返回ETag(从而浏览器再次发送http请求时候不再捎带If-None-Match)

CODE:
FileETag None

这个配置可以加在网站顶级目录的.htaccess文件中,如果使用VPS,或者阿里云主机这样的云服务器,也可以直接在httpd.conf文件中增加,后者更好。

如上修改后我们再次观察服务器的返回的http头部情况,可以发现返回的http头部信息里面不再含有ETag信息了:

CODE:
HTTP/1.x 200 OK
Date: Tue, 08 May 2011 06:39:22 GMT
Server: Apache/2.2.4 (Unix)
Last-Modified: Sat, 20 Nov 2009 20:16:24 GMT
Accept-Ranges: bytes
Content-Length: 44
Connection: close
Content-Type: text/html

0 0
原创粉丝点击