ETag详细资料大全

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了ETag详细资料大全相关的知识,希望对你有一定的参考价值。

参考技术A

HTTP协定规格说明定义ETag为“被请求变数的实体值”。另一种说法是,ETag是一个可以与Web资源关联的记号(token)。典型的Web资源可以一个Web页,但也可能是JSON或XML文档。伺服器单独负责判断记号是什么及其含义,并在HTTP回响头中将其传送到客户端,以下是伺服器端返回的格式:ETag:"50b1c1d4f775c61:df3"客户端的查询更新格式是这样的:If-None-Match : W / "50b1c1d4f775c61:df3"如果ETag没改变,则返回状态304然后不返回,这也和Last-Modified一样。测试Etag主要在断点下载时比较有用。

基本介绍

    中文名 :ETag 概念 :Etag 是URL的Entity Tag 性能 :聪明的伺服器开发者 原理 :请求流程
概念,性能,优势,请求流程,作用,Apache,

概念

Etag 是URL的Entity Tag,用于标示URL对象是否改变,区分不同语言和Session等等。具体内部含义是使伺服器控制的,就像Cookie那样。

性能

聪明的伺服器开发者会把ETags和GET请求的“If-None-Match”头一起使用,这样可利用客户端(例如浏览器)的快取。因为伺服器首先产生ETag,伺服器可在稍后使用它来判断页面是否已经被修改。本质上,客户端通过将该记号传回伺服器要求伺服器验证其(客户端)快取。 其过程如下: 客户端请求一个页面(A)。 伺服器返回页面A,并在给A加上一个ETag。 客户端展现该页面,并将页面连同ETag一起快取。 客户再次请求页面A,并将上次请求时伺服器返回的ETag一起传递给伺服器。 伺服器检查该ETag,并判断出该页面自上次客户端请求之后还未被修改,直接返回响应304(未修改——Not Modified)和一个空的回响体。

优势

1、有些URL是多语言的网页,相同的URL会返回不同的东东。还有不同的Session有不同的Cookie也就有不同的内容。这种情况下如果过 Proxy,Proxy就无法区分导致串门,只能简单的取消cache功能。Etag解决了这个问题,因为它能区分相同URL不同的对象。 2、老的HTTP标准里有个Last-Modified+If-Modified-Since表明URL对象是否改变。Etag也具有这种功能,因为对象改变也造成Etag改变,并且它的控制更加准确。Etag有两种用法 If-Match/If-None-Match,就是如果伺服器的对象和客户端的对象ID(不)匹配才执行。这里的If-Match/If-None- Match都能一次提交多个Etag。If-Match可以在Etag未改变时断线重传。If-None-Match可以刷新对象(在有新的Etag时返回)。 3、Etag中有种Weak Tag,值为 W/"xxxxx"。他声明Tag是弱匹配的,只能做模糊匹配,在差异达到一定阈值时才起作用。 4、Etag对于cache CGI页面很有用。特别是论坛,论坛有办法为每个帖子页面生成唯一的Etag,在帖子未改变时,查看话题属性比较Etag就能避免刷新帖子,减少CGI操作和网路传输。比如论坛中看帖就返回Etag,减少论坛负担。 5、Etag在不同URL之间没有可比性,也就是不同URL相同Etag没有特别意义。

请求流程

Etag由伺服器端生成,客户端通过If-Match或者说If-None-Match这个条件判断请求来验证资源是否修改。常见的是使用If-None-Match.请求一个档案的流程可能如下: ====第一次请求=== 1.客户端发起 HTTP GET 请求一个档案; 2.伺服器处理请求,返回档案内容和一堆Header,当然包括Etag(例如"2e681a-6-5d044840")(假设伺服器支持Etag生成和已经开启了Etag).状态码200 ====第二次请求=== 1.客户端发起 HTTP GET 请求一个档案,注意这个时候客户端同时传送一个If-None-Match头,这个头的内容就是第一次请求时伺服器返回的Etag:2e681a-6-5d044840 2.伺服器判断发送过来的Etag和计算出来的Etag匹配,因此If-None-Match为False,不返回200,返回304,客户端继续使用本地快取; 流程很简单,问题是,如果伺服器又设定了Cache-Control:max-age和Expires呢,怎么办? 答案是同时使用,也就是说在完全匹配If-Modified-Since和If-None-Match即检查完修改时间和Etag之后,伺服器才能返回304.(不要陷入到底使用谁的问题怪圈)

作用

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需要放在""内。

Apache

Apache首先判断是不是弱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。

Youtube API V3 和 Etag

【中文标题】Youtube API V3 和 Etag【英文标题】:Youtube API V3 and Etag 【发布时间】:2014-03-12 05:22:35 【问题描述】:

我使用 youtube api v3,我想了解 Etag 是如何工作的。我想将它用于缓存目的,但我不知道在 PHP 中该做什么。 你能告诉我etag恢复后要遵循的步骤吗?请。感谢您的帮助。

【问题讨论】:

有关在 PHP 客户端中使用 etags 的详细信息,请参阅***.com/questions/27800007/… 【参考方案1】:

根据 youtube 文档 (https://developers.google.com/youtube/v3/getting-started#etags),eTag 基本上用于确定资源是否已更改。将它们用于:

    优化 - 在您的应用中缓存 youtube 资源可以减少带宽和延迟。缓存时,存储 eTag 以便在获取资源时包含它。如果资源没有改变,你会得到一个 304 响应码(NOT MODIFIED),这意味着你可以使用你的缓存版本。否则,您将获得资源的更新版本。

    配额使用情况 - 您可以通过缓存 youtube 数据来减少使用配额的数量。第一次获得资源时,您将利用您的配额。在显示资源之前,首先检查您的缓存资源是否已更改,这将只花费您 1 个配额单位。如果资源没有改变,youtube 会返回 304 响应。如果它发生了变化,您可以再次获得资源,根据您获得的内容花费不同的配额单位。有关您的配额的更多信息:(https://developers.google.com/youtube/v3/getting-started#quota)。

    覆盖保护 - 如果您要覆盖资源,包括 eTag 将确保您不会覆盖较新版本的资源。

eTag 是 HTTP 1.1 规范 (http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.19) 的一部分,用于请求/响应的标头中。这是一篇很好的文章,在低层次上讨论了它们:http://www.ibuildings.com/blog/2013/07/etags-uninitiated

就在 PHP 中使用 eTags 而言,我只能提出一些建议,因为我从未这样做过。 YouTube 会为供稿和供稿中的单个项目返回 eTag,我不知道如何将它们用于供稿中的单个项目。但是要获取原始提要本身,基本上您将使用 curl 并将 eTag 添加到请求的标头 (PHP cURL custom headers)。您可能还想查看 http_cache_etag (http://www.php.net/manual/en/function.http-cache-etag.php)

【讨论】:

非常感谢您的回答和 J Mac。我会研究它 @Redtopia,此答案的配额使用部分不正确。 jsfiddle.net/fw3776vs 此链接是节点代码(不幸的是它不在 JSFiddle 中运行),但它消耗 1000 个配额点的调用,但对所有不是第一个调用的调用使用 etag。如果您在运行控制台后查看控制台,仍然使用了 1000 个配额点。自己运行。 +1 对于@ramr 所说的,使用 etag 仅有助于客户端,但每次调用仅消耗 1 个配额。 @ramr - 并非所有 API 调用都是等效的……有些调用比其他调用使用更多的配额。如果您正在缓存您的数据,则只需 1 个单位的配额即可检查 eTag 版本。如果资源已更新,那么您可以进行 API 调用,该调用将使用更多配额来更新您的缓存资源,【参考方案2】:

我一直在寻找类似的信息,但在 youtube 网站上找不到明确的示例。另一方面,似乎 facebook 正在使用类似的方法(Etags 来检查资源是否已更改),我在 facebook 开发人员区域找到的这两个链接可能会有所帮助:

https://developers.facebook.com/docs/reference/ads-api/etags-reference/ 和 https://developers.facebook.com/blog/post/627/

第一个以更简单、更详细的方式解释了如何使用 etag,并提供了一些请求/响应示例。

第二个链接提供了一个 PHP 示例,说明如何检索资源并提取 etag 并在后续请求中使用它。

当然,这些链接包含与 facebook 网站相关的信息,但在很大程度上,它们也可以应用于 youtube。

【讨论】:

【参考方案3】:

我不确定是否还有人感兴趣,但我已经发布了关于如何在使用 youtube api here 时使用 etag 的答案。这个想法不仅适用于 youtube api。文章很长,希望对您有所帮助。

【讨论】:

以上是关于ETag详细资料大全的主要内容,如果未能解决你的问题,请参考以下文章

Arduino详细资料大全

MIPS详细资料大全

CAP详细资料大全

Cadence详细资料大全

IFC详细资料大全

OpenStack详细资料大全