在线文档教程

ETag

ETag

所述ETag HTTP 响应报头为资源的特定版本的标识符。它允许缓存更高效,并节省带宽,因为如果内容没有改变,Web 服务器不需要发送完整的响应。另一方面,如果内容发生了变化,etags 有助于防止资源的同时更新互相覆盖(“空中冲突”)。

如果给定 URL 处的资源发生更改,则Etag必须生成新值。因此,Etags 与指纹相似,也可能用于某些服务器的跟踪目的。它们的比较可以快速确定资源的两个表示是否相同,但它们也可能被设置为无限期地由跟踪服务器持续存在。

Header typeResponse header
Forbidden header nameno

语法

ETag: W/"<etag_value>" ETag: "<etag_value>"

指令

W/可选'W/'(区分大小写)表示使用弱验证程序。弱验证器很容易生成,但对于比较来说却不太有用。强大的验证器是进行比较的理想选择,但可能非常难以高效生成。

例子

ETag: "33a64df551425fcc55e4d42a148795d9f25f89d4" ETag: W/"0815"

避免空中碰撞

借助标题ETagIf-Match头文件,您可以检测到空中编辑冲突。

例如,在编辑 MDN 时,当前的 wiki 内容被散列并放入Etag响应中:

ETag: "33a64df551425fcc55e4d42a148795d9f25f89d4"

当保存对 wiki 页面的更改(发布数据)时,POST请求将包含包含要检查新鲜度If-MatchETag值的标题。

If-Match: "33a64df551425fcc55e4d42a148795d9f25f89d4"

如果散列不匹配,则意味着文档已被编辑,并且412 Precondition Failed引发错误。

缓存不变的资源

ETag标题的另一个典型用例是缓存未更改的资源。如果用户再次访问一个给定的 URL(它有一个ETag集合),并且它已经过时了,那么这个 URL 太旧而不能被视为可用,客户端会将它的值发送到ETag一个If-None-Match标题字段中:

If-None-Match: "33a64df551425fcc55e4d42a148795d9f25f89d4"

服务器比较客户端ETag(与其If-None-Match一起发送)ETag与其当前版本的资源,并且如果两个值匹配(即资源没有改变),则服务器发回304 Not Modified状态,没有任何正文,告诉客户端缓存版本的响应仍然很好用(新鲜)。

规范

SpecificationTitle
RFC 7232, section 2.3: ETagHypertext Transfer Protocol (HTTP/1.1): Conditional Requests

浏览器兼容性

FeatureChromeFirefoxEdgeInternet ExplorerOperaSafari
Basic Support(Yes)(Yes)(Yes)(Yes)(Yes)(Yes)

FeatureAndroidChrome for AndroidEdge mobileFirefox for AndroidIE mobileOpera AndroidiOS Safari
Basic Support(Yes)(Yes)(Yes)(Yes)(Yes)(Yes)(Yes)