001_HTTP参数中Etag的重要性

在研究tornado时,有个Etag比较好奇,从网上查询摘录以下:javascript

 

 

Etag在HTTP1.1中有介绍,主要的做用就是在(css file, image, javascript file)文件后面添加一个惟一的参数(至关于查询参数字符串),Etag有服务器端生成,而且随着文件的改变而改变,这样浏览器端就会只从新请求获取 Etag发生变化的文件,减小浏览器端数据的流量,加快浏览器的反应速度,重要的是减轻服务器端的压力,因此服务器端Etag的实现就比较重要了.css

如今咱们有个问题为何要使用Etag呢?java

Etag主要为了解决Last-Modified没法解决的一些问题.他能比Last_Modified更加精确的知道文件是否被修改过.若是有个 文件修改很是频繁,好比在秒如下的时间内进行修改,好比1秒内修改了10次,If-Modified-Since能检查只能秒级的修改,因此这种修改没法 判断.缘由是UNIX记录MTIME只能精确到秒.因此咱们选择生成Etag,由于Etag能够综合Inode,MTime和Size,能够避免这个问 题.node

Etag的工做原理
Etag在服务器上生成后,客户端经过If-Match或者说If-None-Match这个条件判断请求来验证资源是否修改.咱们常见的是使用If-None-Match.请求一个文件的流程可能以下:
新的请求
客户端发起HTTP GET请求一个文件(css ,image,js);服务器处理请求,返回文件内容和一堆Header(包括Etag,例如"2e681a-6-5d044840"),http头状态码为为200.apache

同一个用户第二次这个文件的请求
客户端在一次发起HTTP GET请求一个文件,注意这个时候客户端同时发送一个If-None-Match头,这个头中会包括上次这个文件的Etag(例如"2e681a- 6-5d044840"),这时服务器判断发送过来的Etag和本身计算出来的Etag,所以If-None-Match为False,不返回200,返 回304,客户端继续使用本地缓存;浏览器

注意.服务器又设置了Cache-Control:max-age和Expires时,会同时使用,也就是说在彻底匹配If-Modified-Since和If-None-Match即检查完修改时间和Etag以后,服务器才能返回304.缓存

下面是在Apache中的Etag的配置服务器

在Apache中设置Etag的支持比较简单,只须要在apache的配置中加入下面的内容就能够了:网络

FileETag MTime Sizetornado

注解:FileETag指令配置了当文档是基于一个文件时用以建立ETag(实体标签)应答头的文件的属性(ETag的值用于进行缓冲管理以节约网络带 宽).ETag的值由文件的inode(索引节点)、大小、最后修改时间决定.FileETag指令可让您选择(若是您想进行选择)这其中哪些要素将被 使用.主要关键字以下:

INode
    文件的索引节点(inode)数
MTime
    文件的最后修改日期及时间
Size
    文件的字节数
All
    全部存在的域,等价于:FileETag INode MTime Size
None
    若是一个文档是基于文件的,则不在应答中包含任何ETag头

在大型多WEB集群时,使用ETag时有问题,因此有人建议使用WEB集群时不要使用ETag,其实很好解决,由于多服务器时,INode不同,因此不 同的服务器生成的ETag不同,因此用户有可能重复下载(这时ETag就会不许),明白了上面的原理和设置后,解决方法也很容易,让ETag后面二个参 数,MTime和Size就行了.只要ETag的计算没有INode参于计算,就会很准了.

相关文章
相关标签/搜索