ETag
ETag
(或实体标签)HTTP 响应头是资源特定版本的标识符。它使缓存更有效率并节省带宽,因为如果内容没有更改,Web 服务器不需要重新发送完整的响应。此外,ETag 有助于防止对资源的同步更新相互覆盖("空中碰撞")。
如果给定 URL 上的资源发生更改,则必须生成新的 Etag
值。对它们的比较可以确定资源的两个表示是否相同。
语法
ETag: W/"<etag_value>"
ETag: "<etag_value>"
指令
W/
可选-
'W/'
(区分大小写)表示使用了弱验证器。弱 ETag 很容易生成,但对比较而言用处不大。强验证器非常适合比较,但高效生成可能非常困难。相同资源的两个表示的弱ETag
值在语义上可能是等效的,但字节对字节并不完全相同。这意味着当使用字节范围请求时,弱 ETag 会阻止缓存,而强 ETag 意味着范围请求仍然可以被缓存。 - "<etag_value>"
-
唯一代表所请求资源的实体标签。它是一个在双引号之间放置的ASCII 字符串,例如
"675af34563dc-tr34"
。ETag
值的生成方法没有指定。通常,ETag 值是内容的哈希值、最后修改时间戳的哈希值,或者只是一个修订号。例如,维基引擎可以使用文档文章内容的十六进制哈希值。
示例
ETag: "33a64df551425fcc55e4d42a148795d9f25f89d4"
ETag: W/"0815"
避免空中碰撞
借助 ETag
和If-Match
头,您可以检测空中编辑冲突。
例如,在编辑维基时,当前维基内容可能会被哈希并放入响应中的 Etag
头中
ETag: "33a64df551425fcc55e4d42a148795d9f25f89d4"
保存对维基页面的更改(发布数据)时,POST
请求将包含包含要检查新鲜度的 ETag
值的If-Match
头。
If-Match: "33a64df551425fcc55e4d42a148795d9f25f89d4"
如果哈希值不匹配,则表示文档已在中间进行了编辑,并将抛出412 前提条件失败
错误。
未更改资源的缓存
ETag
头的另一个典型用途是缓存未更改的资源。如果用户再次访问给定 URL(设置了 ETag
),并且它陈旧(太旧而无法被认为可用),则客户端将在If-None-Match
头字段中发送其 ETag
的值
If-None-Match: "33a64df551425fcc55e4d42a148795d9f25f89d4"
服务器将客户端的 ETag
(使用 If-None-Match
发送)与其当前版本资源的 ETag
进行比较,如果这两个值匹配(即资源没有更改),则服务器将发送回304
未修改
状态,没有正文,这告诉客户端缓存的响应版本仍然可以使用(新鲜)。
规范
规范 |
---|
HTTP 语义 # field.etag |
浏览器兼容性
BCD 表格仅在浏览器中加载