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