什么事ETag
HTTP协议规格说明定义ETag为“被请求变量的实体值”。另一种说法是,ETag是一个可以与Web资源关联的记号(token)。典型的Web资源可以一个Web页,但也可能是JSON或XML文档。服务器单独负责判断记号是什么及其含义,并在HTTP响应头中将其传送到客户端,以下是服务器端返回的格式:ETag:"50b1c1d4f775c61:df3"客户端的查询更新格式是这样的:If-None-Match : "50b1c1d4f775c61:df3"如果ETag没改变,则返回状态304然后不返回,这也和Last-Modified一样。测试Etag主要在断点下载时比较有用。
服务器开发者会把ETags和GET请求的“If-None-Match”头一起使用,这样可利用客户端(例如浏览器)的缓存。因为服务器首先产生ETag,服务器可在稍后使用它来判断页面是否已经被修改。本质上,客户端通过将该记号传回服务器要求服务器验证其(客户端)缓存。
其过程如下:
客户端请求一个页面(A)。 服务器返回页面A,并在给A加上一个ETag。 客户端展现该页面,并将页面连同ETag一起缓存。 客户再次请求页面A,并将上次请求时服务器返回的ETag一起传递给服务器。 服务器检查该ETag,并判断出该页面自上次客户端请求之后还未被修改,直接返回响应304(未修改——Not Modified)和一个空的响应体。
作用: Etag 主要为了解决 Last-Modified 无法解决的一些问题。
1、一些文件也许会周期性的更改,但是他的内容并不改变(仅仅改变的修改时间),这个时候我们并不希望客户端认为这个文件被修改了,而重新GET;
2、某些文件修改非常频繁,比如在秒以下的时间内进行修改,(比方说1s内修改了N次),If-Modified-Since能检查到的粒度是s级的,这种修改无法判断(或者说UNIX记录MTIME只能精确到秒)
3、某些服务器不能精确的得到文件的最后修改时间;
为此,HTTP/1.1引入了 Etag(Entity Tags).Etag仅仅是一个和文件相关的标记,可以是一个版本标记,比如说v1.0.0或者说"2e681a-6-5d044840"这么一串看起来很神秘的编码。但是HTTP/1.1标准并没有规定Etag的内容是什么或者说要怎么实现,唯一规定的是Etag需要放在""内。
Last-Modified Date(最后修改时间)
第一次请求:
GET /i/yahoo.gif HTTP/1.1
Host: us.yimg.com
第一次响应:
HTTP/1.1 200 OK
Last-Modified: Tue, 12 Dec 2006 03:03:59 GMT
Content-Length: 1195
第二次请求
GET /i/yahoo.gif HTTP/1.1
Host: us.yimg.com
If-Modified-Since: Tue, 12 Dec 2006 03:03:59 GMT
第二次响应
HTTP/1.1 304 Not Modified
Entity Tags(实体标签)
第一次请求:
GET /i/yahoo.gif HTTP/1.1
Host: us.yimg.com
第一次响应:
HTTP/1.1 200 OK
Last-Modified: Tue, 12 Dec 2006 03:03:59 GMT
ETag: "10c24bc-4ab-457e1c1f"
Content-Length: 1195
第二次响应:
GET /i/yahoo.gif HTTP/1.1
Host: us.yimg.com
If-Modified-Since: Tue, 12 Dec 2006 03:03:59 GMT
If-None-Match: "10c24bc-4ab-457e1c1f"
HTTP/1.1 304 Not Modified
ETag带来的问题:
ETag的问题在于,通常使用组件的某些属性来构造它,这些属性对于特定的网站服务器来说是唯一的。当浏览器从一台服务器上获得了组件后,之后,又向另外一台不同的服务器发起GET请求,ETag是不会匹配的——而对于使用服务器集群来处理请求的网站来说,这是很常见的情况。对于拥有多台服务器集群的网站,组件的下载次数可能会比必须进行下载的次数多的多,这将导致性能的下降。
对组件不必要的重新加载还会影响服务器性能并增加带宽开销。ETag还降低了代理缓存的效率。代理后面的用户缓存的ETag常和代理之间不会出现304响应,而会产生两个200响应,一个是从原始服务器到代理,一个是从代理到用户。
If-None-Match比If-Modified-Since有更高优先级。你可能希望如果ETag不匹配但最新修改日期是相同的,也能得到一个304响应,但实际并非如此。依据HTTP1.1规范,同时出现了这两个头,则服务器禁止返回304,出发请求头中字段全部一致
ETag:用还是不用
如果无需自定义ETag,最好将其移除。Apache支持FileETag指令,可以从ETag中移除inode值,只留下大小和时间戳作为组件的ETag。
分享到:
相关推荐
在本书中,作者给出了14条具体的优化原则,每一条原则都配以范例佐证,并提供了在线支持。...术等。本书适合Web架构师、信息架构师、...第13章规则13——配置ETag 第14章规则14——使AJAX可缓存 第15章析构十大网站 索引
在我们用雅虎浏览器工具Yslow时,就有这么一个优化选项,全称为:Configure entity tags (ETags),即配置实体标记,什么是Etags?ETags(Entity tags)是服务器和浏览器的一个功能,它用来判断浏览器缓存里的元素是否...
《高性能网站建设指南》一书介绍了如何针对网站中的Ajax、CSS、JavaScript、Flash和图片进行性能优化。每个性能规则都提供了示例,在本书的配套网站上可以找到代码片段。这些规则包括: •减少HTTP请求 •使用...
《高性能网站建设指南》一书介绍了如何针对网站中的Ajax、CSS、JavaScript、Flash和图片进行性能优化。每个性能规则都提供了示例,在本书的配套网站上可以找到代码片段。这些规则包括: •减少HTTP请求 •使用...
第7章 使用TCMalloc优化Nginx 第8章 PCRE正则表达式 第9章 Nginx高可用的实现 第10章 10个QA 第2部分 Nginx服务器的功能 第11章 限制流量 第12章 限制用户并发连接数 第13章 修改或隐藏Nginx的版本号 第14章...
第7章 使用TCMalloc优化Nginx 第8章 PCRE正则表达式 第9章 Nginx高可用的实现 第10章 10个QA 第2部分 Nginx服务器的功能 第11章 限制流量 第12章 限制用户并发连接数 第13章 修改或隐藏Nginx的版本号 第14章...
第7章 使用TCMalloc优化Nginx 第8章 PCRE正则表达式 第9章 Nginx高可用的实现 第10章 10个QA 第2部分 Nginx服务器的功能 第11章 限制流量 第12章 限制用户并发连接数 第13章 修改或隐藏Nginx的版本号 第14章...
etag etag
19 应用数据静态化架构高性能单页Web应用 377 19.1 整体架构 378 19.1.1 CMS系统 379 19.1.2 前端展示系统 380 19.1.3 控制系统 380 19.2 数据和模板动态化 381 19.3 多版本机制 381 19.4 异常问题 382 20 使用...
在我们的sitemap配置了ETag之后,对日志一段时间的监测发现,其sitemap响应时间以及耗时的平均时间均大幅度下降,爬虫访问 sitemap文件的次数有所增加,对于收录而言,通过图表也能看出相对的增长曲线,我们的整体...
Server.xml配置文件用于对整个容器进行相关的配置。 元素: 是整个配置文件的根元素。表示整个Catalina容器。 属性: className:实现了org.apache.catalina.Server接口的类名,标准实现类是org.apache.catalina....
Laravel开发-laravel-etag 支持etag头的laravel ratelimiter。
用于在 ASP.NET Web API 中读取和设置 ETag 标头的异步模式。 目标 单个文件,如 PetaPoco / Massive 仅 ETag,至少一开始 指定方式 ETag查找功能 模型获取函数 具有当前 ETag 的模型的属性 注意检查请求头和设置...
Etag http If-None-Match If-Modified-Since Last-Modified 使用Demo 已经可以直接使用
HTTP中的ETag是什么意思,如何使用
页面性能优化的34条黄金守则 1、尽量减少HTTP请求次数 2、减少DNS查找次数 3、避免跳转 4、可缓存的AJAX 5、推迟加载内容 6、预加载 7、减少DOM元素数量 8、根据域名划分页面内容 9、使iframe的数量最小 10、不要...
Laravel开发-laravel-etag-middleware 一种Laravel中间件,用于向HTTP请求添加etags以提高响应时间
Laravel开发-laravel-weak-etag-middleware 向HTTP响应头添加弱etags的Laravel中间件