条件请求与 ETag

用 ETag/Last-Modified 与 If-None-Match/If-Match 实现缓存校验与并发控制:读取省流量,写入用 If-Match 防丢更新(乐观锁)。

交互

交互
GET /docs/1 → 200, ETag: "v7"
后续 GET 带 If-None-Match: "v7" → 304 Not Modified

更新请求带 If-Match: "v7";
版本不匹配 → 412 Precondition Failed(提示重新拉取合并)
ETag 常用内容哈希或版本号;多节点部署要保证同一版本在各节点生成一致。

易错点

  • If-Match 比较被忽略或使用弱校验,丢更新仍发生
  • 多节点 ETag 生成规则不一致,缓存频繁失效

数据来源与参考

  • RFC 9110 HTTP Semantics(第 13 章条件请求)
  • RFC 7232:Conditional Requests
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌