etag那些事

2024-06-22 05:48
文章标签 etag

本文主要是介绍etag那些事,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

categories: [计算机通识,计算机网络]
thumbnail: /images/fe/etag.jpg
toc: true

浅谈etag

ETag是一个可以与Web资源关联的记号(token)。典型的Web资源可以一个Web页,但也可能是JSON或XML文档。服务器单独负责判断记号是什么及其含义,并在HTTP响应头中将其传送到客户端,以下是服务器端返回的格式:

ETag:“50b1c1d4f775c61:df3”

客户端的查询更新格式是这样的:

If-None-Match : W / “50b1c1d4f775c61:df3”

如果ETag没改变,则返回状态304然后不返回,这也和Last-Modified一样

Etag - 作用

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生成的方式

强etag

强Etag根据配置文件中的配置来设置Etag值,默认的Apache的FileEtag设置为:

FileEtag INode Mtime Size

也就是根据这三个属性来生成Etag值,他们之间通过一些算法来实现,并输出成hex的格式,相邻属性之间用-分隔,比如:

Etag"2e681a-6-5d044840"

这里面的三个段,分别代表了INode,MTime,Size根据算法算出的值的Hex格式,(如果在这里看到了非Hex里面的字符(也就是0-f),那你可能看见神了:))

当然,可以改变Apache的FileEtag设置,比如设置成FileEtagSize,那么得到的Etag可能为:

Etag"6"

总之,设置了几个段,Etag值就有几个段。(不要误以为Etag就是固定的3段式)

说明

这里说的都是Apache2.2里面的Etag实现,因为HTTP/1.1并没有规定Etag必须是什么样的实现或者格式,因此,也可 以修改或者完全编写自己的算法得到Etag,比如"2e681a65d044840",客户端会记住并缓存下这个Etag(Windows里面保存在哪 里,下次访问的时候直接拿这个值去和服务器生成的Etag对比。

注意
不管怎么样的算法,在服务器端都要进行计算,计算就有开销,会带来性能损失。因此为了榨干这一点点性能,不少网站完全把Etag禁用了(比如Yahoo!),这其实不符合HTTP/1.1的规定,因为HTTP/1.1总是鼓励服务器尽可能的开启Etag。

弱etag

重新考虑前面提到的3个问题:

问题1、一些文件也许会周期性的更改,但是他的内容并不改变(仅仅改变的修改时间),这个时候我们并不希望客户端认为这个文件被修改了,而重新GET;

解决办法:如果使用强Etag,每次得会要求重新GET页面,如果使用Etag,比方说设置成 File Etag Size 等,就可以忽略 MTime 造成的 Last-Modified 时间修改从而影响了 If-Modified-Since(IMS) 这个校验了。这点和弱Etag无关。

问题2、某些文件修改非常频繁,比如在秒以下的时间内进行修改,(比方说1s内修改了N次),If-Modified-Since能检查到的粒度是s级的,这种修改无法判断(或者说UNIX记录MTIME只能精确到秒)

解决办法:如果是这种情况,Apache会自动判断请求时间和修改时间之间的差值,如果小于1s,Apache会认为这个文件在这1秒内可能会再次被修改, 因此生成一个弱Etag(WeakEtag),这个Etag仅仅基于MTime来生成,因此MTime只能精确到s,所以1s内生成的Etag总是一样, 这样就避免了使用强Etag造成的1s内频繁的刷新Cache的情况。(貌似不用Etag,仅仅使用Last-Modified就可以解决,但是这针对的 仅仅是修改超级频繁的情况,很多文件可能同时也使用强Etag验证)。弱Etag以W/开始,比如:W/“2e681a”

问题3、某些服务器不能精确的得到文件的最后修改时间;

解决办法:生成Etag,因为Etag可以综合Inode,MTime和Size,可以避免这个问题

这篇关于etag那些事的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1083460

相关文章

Etag 笔记

用于标识出资源的状态。当资源发生变更时,如果其头信息中一个或者多个发生变化,或者消息实体发生变化,那么ETag也随之发生变化。 ETag常与If-None-Match或者If-Match一起,由客户端通过HTTP头信息(包括ETag值)发送给服务端处理。ETag使用如下: request headers ......If-None-Match: "3c64e7a072b3b57e100c9

关于何时使用实体标签ETag和最后修改时间(Last-modified)的规则

我们对源服务器,客户端和缓存采用一套规则和建议来规定不同的验证器何时应该被使用,出 于何种目的被使用。 HTTP/1.1 源服务器: -          应该发送一个实体标签验证器除非源服务器产生这样一个实体标签不可行。 -          可能会发送弱实体标签而不是强实体标签,如果使用弱实体标签能提高性能的话或者如果发送一个强实体标签不可行的情况下。 -          应该发送

HTTP协议中ETag使用(利用浏览器缓存提高访问效率)

Etag 是URL的Entity Tag,用于标示URL对象是否改变,区分不同语言和Session等等。具体内部含义是使服务器控制的,就像Cookie那样。   HTTP协议规格说明定义ETag为“被请求变量的实体值” 。另一种说法是,ETag是一个可以与Web资源关联的记号(token)。典型的Web资源可以一个Web页,但也可能是JSON或XML文档。服务器单独负责判断记号是什

Web前端性能优化(八)配置ETag

本文转自:http://www.chinaz.com/web/2015/0417/399752.shtml 什么是ETag? 实体标签(EntityTag)是唯一标识了一个组件的一个特定版本的字符串,是web服务器用于确认缓存组件的有效性的一种机制,通常可以使用组件的某些属性来构造它。 条件GET请求 浏览器下载组件的时候,会将它们存储到浏览器缓存中。如果需要再次获取

ETag、Expires、Cache-Control

ETag,全称为:Entity Tag,意思是实体标签,从名字上看,是对于某种实体的一个标识。它属于HTTP协议的一部分,也就是所有的Web服务器都应该(也确实能)支持这个特性。它的作用是用一个特殊的字符串来标识某个资源的“版本”,客户端(浏览器)来请求的时候,可以比较,如果ETag一致,则表示该资源并没有修改过,客户端(浏览器)可以使用自己缓存的版本。   响应标头优势 和特点劣势 和可能的

HTTP 协议请求头 If-Match、If-None-Match 和 ETag

概述 在 HTTP 协议中,请求头 If-Match、If-None-Match、If-Modified-Since、If-Unmodified-Since、If-Range 主要是为了解决浏览器缓存数据而定义的请求头标准,按照协议规范正确的判断和使用这几个请求头,可以更精准的处理浏览器缓存,从而达到提高系统性能和减少系统带宽的占用的目的。 更精准的处理 Web 缓存效果是可以很明显的: 1

使用ETag协议实现ASP.NET Core API缓存

通常,我们在ASP.NET Core API服务端实现缓存,数据直接从缓存中取出,返回给客户端,以便加快响应速度。 但是这样的做法,解决不了数据传输到客户端需要占用带宽带来的性能问题。 这时,可以尝试使用ETag。 ETag协议 ETag是一个字符串;它表示客户端拥有的数据的某个“版本”。 客户端需要在请求头If-None-Match中传入ETag值,服务端检查到此特定请求头,会将此值与从服务端

HTTP 协议请求头 If-Match、If-None-Match 和 ETag

概述 在 HTTP 协议中,请求头 If-Match、If-None-Match、If-Modified-Since、If-Unmodified-Since、If-Range 主要是为了解决浏览器缓存数据而定义的请求头标准,按照协议规范正确的判断和使用这几个请求头,可以更精准的处理浏览器缓存,从而达到提高系统性能和减少系统带宽的占用的目的。 更精准的处理 Web 缓存效果是可以很明显的: 1

http响应Last-Modified和ETag

http://m.blog.csdn.net/blog/u010064842/38186567 1.什么是”Last-Modified”?   在浏览器第一次请求某一个URL时,服务器端的返回状态会是200,内容是你请求的资源,同时有一个Last-Modified的属性标记此文件在服务期端最后被修改的时间,格式类似这样:   Last-Modified: Fri, 12 May 2006

三、浏览器缓存动如何使用(Expires、 cache-control、Etag、last-modified)----哪些文件需要强缓存,哪些文件需要协商缓存

参考链接1:彻底弄懂强缓存与协商缓存 参考链接2:浏览器缓存 参考链接3:扼杀 304,Cache-Control: immutable 如何搭建 express,或者node服务 ### 如何搭建 express,npm install express --save### express 如何实现热更新npm install node-dev -D// package.json 里的sc