ETag是服务器基于资源内容生成的唯一字符串标识,比Last-Modified更精准,因其依赖内容哈希而非秒级时间戳,可避免内容变更而修改时间未变导致的缓存误判;浏览器通过If-None-Match头与服务器ETag比对,一致则返回304复用缓存。

ETag 实现精准资源更新,核心在于用唯一标识代替时间戳做比对,避免因文件修改时间未变但内容已变导致的缓存误判。
ETag 是什么,为什么比 Last-Modified 更准
ETag 是服务器为资源生成的一个字符串标识,比如 ETag: "abc123",它通常基于文件内容(如哈希值)计算得出。只要内容变了,ETag 就变;内容没变,ETag 就不变。而 Last-Modified 依赖文件系统的时间戳,可能文件内容改了但保存时没触发时间更新,或批量部署时所有文件时间戳一致,导致浏览器误认为资源未变。
浏览器如何用 ETag 触发 304 响应
流程分两步:
Java Maven 项目审查工作流的通用输入处理。当 Java Maven 项目以 ZIP压缩包或 GitLab 仓库 URL 形式提供且需要...时使用。
- 首次请求:服务器返回资源 + ETag: "xyz789"
- 后续请求:浏览器自动带上 If-None-Match: "xyz789"
- 服务器收到后,比对当前资源的 ETag 与请求头中的值
- 一致 → 返回 304 Not Modified,不传正文,复用本地缓存
- 不一致 → 返回 200 OK + 新资源 + 新 ETag
在 Node.js 或 Web 服务中设置 ETag 的关键点
不是所有服务器默认开启强校验 ETag。需注意:
立即学习“Java免费学习笔记(深入)”;
- 静态资源(JS/CSS/图片)建议由 Web 服务器(如 Nginx)或构建工具(如 Webpack 插件)自动生成 ETag,基于文件内容而非路径
- 若用 Express,可配合 express.static() 默认启用 ETag(默认为 weak ETag,适合静态资源)
- API 接口返回 JSON 时,若需协商缓存,需手动计算响应体的哈希(如 SHA-256),设为 ETag 值,并在中间件中解析 If-None-Match
- 避免使用弱 ETag(W/"xxx")用于强一致性场景,除非明确接受语义等价即可缓存
配合 Cache-Control 使用效果最佳
ETag 属于协商缓存,单独用仍需发起请求。实际项目中应组合强缓存:
- 静态资源响应头设:Cache-Control: public, max-age=31536000, immutable
- 同时提供 ETag:这样一年内直接走强缓存;过期后靠 ETag 快速验证是否需要重下
- 开发环境可禁用 ETag(如设置 etag: false),避免哈希计算开销影响热更新速度

















