转自 http://www.php-oa.com/2008/08/27/etag.html
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参于计算,就会很准了.
分享到:
相关推荐
HTTP中的ETag是什么意思,如何使用
Etag http If-None-Match If-Modified-Since Last-Modified 使用Demo 已经可以直接使用
etag etag
Laravel开发-laravel-etag 支持etag头的laravel ratelimiter。
Etags原理:Add an Expires header已经对浏览器缓存机制中的Cache-Control和Expires进行了配置,这一条评测的是另外两个:Last-Modified和ETag。简单的说,即使设置了文件的期限,浏览器在访问资源时也会因为Last-...
Laravel开发-laravel-etag-middleware 一种Laravel中间件,用于向HTTP请求添加etags以提高响应时间
Laravel开发-laravel-weak-etag-middleware 向HTTP响应头添加弱etags的Laravel中间件
一个插件,根据自动生成 HTTP ETag 并在需要时返回 304。 安装 npm i fastify-etag 例子 'use strict' const Fastify = require ( 'fastify' ) const Etag = require ( 'fastify-etag' ) const app = Fastify ( ) ...
2、静态下Apache、Lighttpd和Nginx中Etag和Expires配置3、非实时交互动态页面中Etag和Expires处理在客户端通过浏览器发出第一次请求某一个URL时,根据 HTTP 协议的规定,浏览器会向服务器传送报头(Http Request ...
角度HTTP ETag 经过测试:IE 9+; 边缘13; Chrome29,50+; Firefox 46+; Safari 7+; iOS 9.2以上版本; Android 4.4、5.1。 简单的基于ETag的$http服务请求缓存! 增加响应速度,减少带宽使用。 缓存ETag标头,并...
Go的缓存控制中间件添加ETag头(内容的md5)和Cache-Control头
此处只是简单的将数据存储在内存中,并且在多服务集群下未做同步,因为此处的目的是实现ETag存储sessionID,若要进行商用,则无比采用第三方 cache,比如redis 此处并不是设计一个通用的框架,因此会有相关的业务...
java断点下载,比对Etag值判断是否需要重新下载,支持http认证用户名密码,源码下载真实可用
Etag和Expires.docx
sitemap是解决网站收录至关重要的途径之一,而通常sitemap的更新都不是很及时,并且体量都相对较大,此时也消耗了相应的网站流量及带宽。而ETag可以用来标示网页是否发生了变化,如果没有变化返回304状态码,就不用...
:light_bulb: 该中间件是为 v2.xx设计的,并使用来实现ES5兼容性。 :wrench: 该中间件正在开发中。 反馈/公关受到欢迎和鼓励。 如果您想在这个项目上进行合作,请告诉我。 安装 $ npm install --save koa-async-...
在 MagpieRSS 的 Features 中列举了这样的一条: HTTP Conditional GETs Save bandwidth and speed up download times with intelligent use of Last-Modified and ETag.. 这里的 Etag 引起了我的注意. 什么是 ...
主要介绍了HTTP缓存头Last-Modified和ETag介绍,需要的朋友可以参考下