HTTP参数中Etag的重要性

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

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

现在我们有个问题为什么要使用Etag呢?

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

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

同一个用户第二次这个文件的请求
客户端在一次发起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 Size

注解: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参于计算,就会很准了.

时间: 2024-11-05 15:48:32

HTTP参数中Etag的重要性的相关文章

用PHP操作http中Etag、lastModified和Expires标签

http://blog.hehehehehe.cn/a/10994.htm 客户端通过浏览器发出第一次请求某一个URL时,根据 HTTP 协议的规定,浏览器会向服务器传送报头(Http Request Header),服务器端响应同时记录相关属性标记(Http Reponse Header),服务器端的返回状态会是200,格式类似如下: 1. HTTP/1.1 200 OK 2. Date: Tue, 03 Mar 2012 04:58:40 GMT 3. Content-Type: image

jsp get方式请求参数中包含中文乱码问题解决

1. 自己接收到参数之后在后台进行转码处理 2: 修改tomcat的配置文件  server.xml <Connector port="8080" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8443" URIEncoding="utf-8"/> 即可 jsp get方式请求参数中包含中文乱码问题解决,布布扣,bubuk

php判断URL参数中是否存在某些项

<?php $old_url = $_SERVER["REQUEST_URI"]; //检查链接中是否存在 ? $check = strpos($old_url, '?'); //如果存在 ? if($check !== false) { //如果 ? 后面没有参数,如 http://www.yitu.org/index.php? if(substr($old_url, $check+1) == '') { //可以直接加上附加参数 $new_url = $old_url; }

Hadoop 分析图中节点的重要性,求解图中节点三角形个数

Hadoop 求解无向图中节点的重要性,通过求解节点的三角形个数来展现: 求解图中节点重要性,并排序,在大数据,分布式处理大型图组织形式的数据时很重要,找出重要节点,并对重要节点做特殊处理是很重要的 下面讲解如何来求解 这篇文章分为三部分: 1,python生成无向图的邻接矩阵 2,python画出这个无向图 3,hadoop mapreduce 求解图中每个节点的三角形个数 关于hadoop求解矩阵相乘,请看之前的文章:http://blog.csdn.net/thao6626/article

python-在定义函数时,不定长参数中,默认值参数不能放在必选参数前面

如果一个函数的参数中含有默认参数,则这个默认参数后的所有参数都必须是默认参数,否则会报错:SyntaxError: non-default argument follows default argument 例如: #-*- coding:utf-8 -*-def test(a=11,b,c): #默认值参数不能放在必选参数前面    print(a)    print(b)    print(c)    test(11,22,33) 改正: #-*- coding:utf-8 -*- def

测试oracle 11g cluster 中OLR的重要性

 测试oracle 11g cluster 中OLR的重要性 called an Oracle Local Registry (OLR): each node in a cluster has a local registry for node-specific resources 测试一:模拟olr异常丢失的情况: 这里首先将olr renam [[email protected] cdata]# mv vmrac2.olr vmrac2.olr.bak 然后尝试去启动crs [[emai

经历:sybase的sql查询,当传递的参数中包含全角空格(\u00a0),查询慢

今天,我遇到了一个sybase数据库查询的问题.一句简单的sql,但是不知道为什么查询不出来,导致生产生产服务器频频挂掉.吓得我的小心脏砰砰啊. select DISTINCT A.FCIL_CDE as fcilCde from DND_EVENT_LOG A WHERE A.DOC_REF =? AND A.DOC_TYPE = ? AND A.START_OR_END = 'S' 后来,经网络运营经理查询,原来是客户传递的参数中包含了特殊字符,即全角空格的转义(\u00a0). 原因是由于

ajax请求中传递的参数中如果含有特殊字符怎么处理?

在JQUERY AJAX开发中遇到了下面的一个问题,在执行AJAX请求的时候,需要传递一个“50%”的参数,而这个参数中含有特殊字符%.这样的话就会出现问题了,我们知道服务器在发送请求的时候,会将url中的参数转化成类似于“%2C%2F%3F%3A%40%26%3D%2B%24%23”,所以在我们执行含有这样特殊字符的ajax请求的时候就会出现错误,因为我们传递的参数可能发生了变化,也可能由于参数本身中就含有特殊字符所以系统没有办法编译它. 可能会抛出这样的一个异常: 警告: Parameter

7z命令行参数中的路径

最近在自动化的过程中用到了7z命令行工具,发现其参数中的路径挺有意思的,在此总结一下.本文中所有demo使用的7z版本为:15.14 x64. 压缩某个文件夹 下面的命令会把g:\temp\目录和目录下的所有文件打包到压缩文件abc.zip中. 7z.exe a abc.zip g:\temp\ 注意,此时压缩包中是包含temp目录的. 当我们解压缩abc.zip文件时就会发生一件比较有趣的事.无论通过右键菜单中windows提供的”Extract All…”还是7z提供的”Extract fi