← 中文资源

简体中文版本

ETag

ETag 是标识资源特定版本的 HTTP 验证器,客户端回传后可跳过未变化响应,并避免并发覆盖。

阅读英文原文

工作原理

服务器为资源的每个表示分配不透明标签,通常是内容哈希或版本号。

HTTP/1.1 200 OK
ETag: "v17-8f2c"
Cache-Control: public, max-age=60

客户端在 If-None-Match 中回传标签;若表示未变化,服务器返回不带响应体的 304 Not Modified。写入时使用 If-Match 使更新有条件:只有当前标签匹配才执行,否则返回 412 Precondition Failed。强标签断言字节相等,W/"abc" 这样的弱标签只断言语义等价,不能用于范围请求。

使用场景与取舍

ETag 适合 API 响应缓存验证、不可变资源版本化和更新的乐观并发控制。与 Last-Modified 相比,它通常更精确,后者只有秒级粒度,可能漏掉快速变化。大文件下载可用 If-Range 把验证器与范围请求结合。

对大响应做哈希消耗 CPU,版本计数器便宜但每次写入都必须变化。CDN 和压缩会改变字节,强标签可能在边缘被弱化或重写,源站与边缘必须达成一致。负载均衡集群中的标签若不能从共享内容或版本派生,就会发生漂移。

具体示例

编辑接口要求客户端提交 If-Match。两个用户同时编辑时,只有第一个匹配当前 ETag 的更新成功,第二个收到 412 并重新加载,从而避免静默覆盖。