ETag 头部

Baseline 已广泛支持

此特性已相当成熟,可在许多设备和浏览器版本上使用。自 ⁨2015 年 7 月⁩以来,各浏览器均已提供此特性。

HTTP ETag(实体标签)响应头是资源特定版本的一个标识符。它让缓存更高效,并节省带宽,因为如果内容没有改变,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 值是内容的哈希值、最后修改时间戳的哈希值或仅仅是一个修订号。例如,一个 Wiki 引擎可以使用文档文章内容的十六进制哈希值。

示例

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

避免空中碰撞

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

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

http
ETag: "33a64df551425fcc55e4d42a148795d9f25f89d4"

保存对 Wiki 页面的更改(提交数据)时,POST请求将包含If-Match头,其中包含用于检查新鲜度的ETag值。

http
If-Match: "33a64df551425fcc55e4d42a148795d9f25f89d4"

如果哈希值不匹配,则表示文档在此期间已被编辑,并会抛出412 Precondition Failed错误。

未更改资源的缓存

ETag头的另一个典型用途是缓存未更改的资源。如果用户再次访问给定 URL(已设置ETag),并且该 URL 是过期的(太旧而不能被视为可用),客户端将通过If-None-Match头字段发送其ETag

http
If-None-Match: "33a64df551425fcc55e4d42a148795d9f25f89d4"

服务器会将客户端的ETag(随If-None-Match发送)与其当前版本资源的ETag进行比较,如果两个值匹配(即资源未更改),服务器会返回一个不带主体的304 Not Modified状态,这会告知客户端响应的缓存版本仍然可以使用(新鲜的)。

规范

规范
HTTP 语义
# field.etag

浏览器兼容性

另见