`
tiandirensoon
  • 浏览: 597889 次
文章分类
社区版块
存档分类
最新评论

HTTP头信息中的参数Etag

 
阅读更多
服务器如果是集群,不同服务器返回的 Http Header 中的 Etag 参数不一样。如果是图片是程序生成的,我们可以用 no-cache 这些 header 来控制,但如果这些图片是 apache 或 nginx 等呢?
下面开始介绍 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参与计算,就会很准了.

如果动态程序要生成ETAG 也很简单,如: $etag = ‘”‘ . md5($body) . ‘”‘;

分享到:
评论

相关推荐

    HTTP协议详解

    13 HTTP中的缓存 13.1.1缓存正确性(Cache Correctness) 13.1.2警告信息(Warnings) 13.1.3缓存控制机制 (Cache-control Mechanism) 13.1.4显示的用户代理警告(Explicit User Agent Warnings) 13.1.5规则和...

    Http1.1超文本传输协议中文版

    13 HTTP中的缓存 71 13.1.1缓存正确性(Cache Correctness) 72 13.1.2警告信息(Warnings) 72 13.1.3缓存控制机制 (Cache-control Mechanism) 73 13.1.4显示的用户代理警告(Explicit User Agent Warnings) 73 ...

    xUtils3 demo

    // 返回 false 继续请求网络, 但会在请求头中加上ETag, Last-Modified等信息, // 如果服务端返回304, 则表示数据没有更新, 不继续加载数据. // this.result = result; return false; // true: 信任缓存数据, 不...

    netcat 瑞士军刀 linux windows netcat 瑞士军刀 linux windows

    这种畸形的HTTP GET请求的关键特性是该请求的末尾有一个特定的头信息Translate:f,并有一个反斜杠”\”附于URL之后。下面就有这样的一个例子([CRLF]代表回车字符)  注意 GET global.asa 后的反斜杠以及Translate...

    angular-template-cache-resolver:一个解决模板缓存问题的拦截器

    每次应用程序启动时生成的唯一哈希,并将此哈希作为搜索参数附加到模板请求中。 在应用程序生命周期中,模板由angular缓存,您不必担心angular-template-cache-resolver引起的网络流量。 她在应用程序的生命周期中...

    dive into python

    4.2. 使用可选参数和命名参数 4.3. 使用 type、str、dir 和其它内置函数 4.3.1. type 函数 4.3.2. str 函数 4.3.3. 内置函数 4.4. 通过 getattr 获取对象引用 4.4.1. 用于模块的 getattr 4.4.2. getattr 作为一...

    xUtils3:Android orm,位图,http,视图注入。

    xUtils3简介 xUtils包含了orm,http,图像,视图注解,但依然很轻量级(251K),并且特性强大,方便扩展。 ...支持缓存(实现了Cache-Control,Last-Modified,ETag等特性,缓存内容过多时使用过期

    pic-on-qiniu::party_popper: 基于七牛的图床,支持拖拽上传,复制上传,批量上传以及浏览历史记录

    因此,使用之前,需要首先设置七牛参数。注册七牛账号,登录。进入 ,新建一个用于存储图片的公开 bucket(例如 my-pictures),给 bucket 绑定域名,例如 asset.my.com。进入 ,获取 AccessKey 以及 SecretKey。...

    迈思网站内容管理系统(MyStepCMS) 1.0.5.zip

     浏览器缓存,通过etag标识,在客户端再次请求页面数据时,如页面未发生变化,则直接从客户端缓存调用数据,减少了对服务器带宽的请求。 12、搜索引擎全面优化  网站页面结构严格按照搜索引擎检索习性优化,保证...

    MyStepCMS 迈思网站内容管理系统 v1.0.5.zip

    浏览器缓存,通过etag标识,在客户端再次请求页面数据时,如页面未发生变化,则直接从客户端缓存调用数据,减少了对服务器带宽的请求。   12、搜索引擎全面优化 网站页面结构严格按照搜索引擎检索习性优化,保证...

    Tinman:基于 Experience API 的 Java 学习记录存储

    ##Server 身份验证:LRS 使用 RFC 2617 中定义的基本身份验证 LMS 向 LRS 发送 POST 或 PUT 请求,端点基本/请求例如为用户请求凭据。 请求的主体将是一个 JSON 对象 财产 类型 解释 范围 字符串数组 基于 到期 ISO...

    xUtils Android工具包 v3.9.0

    支持缓存(实现了Cache-Control,Last-Modified,ETag等特性,缓存内容过多时使用过期时间+LRU双重机制清理) 支持异步和同步(可结合RxJava使用)调用 3、image:有了http(s)及其下载缓存的支持,image模块的实现相当...

    easy-api:简单的api,基于koa2,mongodb,redis

    环境需求nodejs> = 8.8.1 mongodb Redis特性签名验证,将不合法请求拒之门外 JWT授权验证,退出后令牌自动回收统一类别异常处理自动请求ID,方便请求追踪,支持前端预先调试简单可重用的请求参数校验器记录请求日志...

    xUtils Android工具包-其他

    支持缓存(实现了Cache-Control,Last-Modified,ETag等特性,缓存内容过多时使用过期时间+LRU双重机制清理) 支持异步和同步(可结合RxJava使用)调用 3、image:有了http(s)及其下载缓存的支持,image模块的实现相当的...

    MyStep Framework开发框架-PHP

    迈思框架(MyStep Framework)是一套基于 [PHP 7.0] 的web开发框架,旨在构建一...浏览器缓存,通过etag标识,在客户端再次请求页面数据时,如页面未发生变化,则直接从客户端缓存调用数据,减少了对服务器带宽的请求。

    WODIG博客类程序修改完整版

    ConstWeb_HTTP='http://www.wodig.com''网址 ConstWeb_KeyWords='wodig\u4e0b\u8f7d,wodigg\u4e0b\u8f7d,\u6211\u9876\uff0cdigg\u7a0b\u5e8f\u4e0b\u8f7d,digg.com''搜索关键字,这样便于baidu,google等搜索收录 ...

    Dive Into Python 中文版

    目录 第 1 章 安装 Python........................................................................................................................................7 ...4.2. 使用可选参数和命名参数 .....

Global site tag (gtag.js) - Google Analytics