ETag

ETag(或实体标签)HTTP 响应头是资源特定版本的标识符。它使缓存更有效率并节省带宽,因为如果内容没有更改,Web 服务器不需要重新发送完整的响应。此外,ETag 有助于防止对资源的同步更新相互覆盖("空中碰撞")。

如果给定 URL 上的资源发生更改,则必须生成新的 Etag 值。对它们的比较可以确定资源的两个表示是否相同。

头类型 响应头
禁止的头名称

语法

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

指令

W/ 可选

'W/'(区分大小写)表示使用了弱验证器。弱 ETag 很容易生成,但对比较而言用处不大。强验证器非常适合比较,但高效生成可能非常困难。相同资源的两个表示的弱 ETag 值在语义上可能是等效的,但字节对字节并不完全相同。这意味着当使用字节范围请求时,弱 ETag 会阻止缓存,而强 ETag 意味着范围请求仍然可以被缓存。

"<etag_value>"

唯一代表所请求资源的实体标签。它是一个在双引号之间放置的ASCII 字符串,例如 "675af34563dc-tr34"ETag 值的生成方法没有指定。通常,ETag 值是内容的哈希值、最后修改时间戳的哈希值,或者只是一个修订号。例如,维基引擎可以使用文档文章内容的十六进制哈希值。

示例

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

避免空中碰撞

借助 ETagIf-Match 头,您可以检测空中编辑冲突。

例如,在编辑维基时,当前维基内容可能会被哈希并放入响应中的 Etag 头中

http
ETag: "33a64df551425fcc55e4d42a148795d9f25f89d4"

保存对维基页面的更改(发布数据)时,POST 请求将包含包含要检查新鲜度的 ETag 值的If-Match 头。

http
If-Match: "33a64df551425fcc55e4d42a148795d9f25f89d4"

如果哈希值不匹配,则表示文档已在中间进行了编辑,并将抛出412 前提条件失败 错误。

未更改资源的缓存

ETag 头的另一个典型用途是缓存未更改的资源。如果用户再次访问给定 URL(设置了 ETag),并且它陈旧(太旧而无法被认为可用),则客户端将在If-None-Match 头字段中发送其 ETag 的值

http
If-None-Match: "33a64df551425fcc55e4d42a148795d9f25f89d4"

服务器将客户端的 ETag(使用 If-None-Match 发送)与其当前版本资源的 ETag 进行比较,如果这两个值匹配(即资源没有更改),则服务器将发送回304 未修改 状态,没有正文,这告诉客户端缓存的响应版本仍然可以使用(新鲜)。

规范

规范
HTTP 语义
# field.etag

浏览器兼容性

BCD 表格仅在浏览器中加载

另请参阅