apache默认为静态文件生成etag,常用inode-mtime-size组合;比对if-none-match后匹配则返回304,否则返回200及新etag;可配置fileetag mtime size提升一致性,或fileetag none禁用。
apache 默认启用 etag 机制,但它的行为取决于配置和资源类型。它不靠 etag 单独决定缓存是否失效,而是配合客户端请求中的 if-none-match 头,由服务器端比对后返回 304 not modified 或 200 ok 来完成验证与失效判断。
ETag 是如何生成的
Apache 默认为静态文件(如 HTML、CSS、JS、图片)自动生成 ETag。生成方式有两种:
-
基于文件元数据:默认使用
INode-MTime-Size组合(即文件系统 inode 号、最后修改时间、字节大小)。这种方式在单台服务器上稳定,但在多服务器或 NFS 环境下可能导致同一资源产生不同 ETag,影响 CDN 或负载均衡场景的一致性。 -
仅基于 MTime 和 Size:可通过配置禁用 inode 参与,例如在
httpd.conf或虚拟主机中添加:FileETag MTime Size
这能提升跨服务器环境下的 ETag 可靠性。
缓存验证流程怎么走
当浏览器已有缓存且强缓存过期(或被 no-cache 跳过)时,会发起带验证头的请求:
Apache Superset 是一个广泛采用的开源 BI 平台,用于 SQL 探索、图表构建和仪表板交付。当代理需要查询仓库数据、组装仪表板或使用成熟的分析界面解释指标而不是临时笔记本代码时,此技能非常有用。
- 浏览器在请求头中带上:
If-None-Match: "xyz123"(值为上次响应中的 ETag) - Apache 收到请求后,读取当前资源的最新 ETag 值,与
If-None-Match中的值严格比对(含引号); - 若完全匹配 → 返回
304 Not Modified,不发正文,浏览器复用本地缓存; - 若不匹配(或资源不存在/ETag 不可计算)→ 返回
200 OK及新内容,并在响应头中附上新的ETag。
怎么控制或禁用 ETag
并非所有场景都需要 ETag。例如静态资源已用指纹名(如 main.a1b2c3.css),就可彻底关闭以减少响应头体积和计算开销:
- 全局禁用:
FileETag None(写入httpd.conf或站点配置) - 针对特定目录禁用:
<directory><br> FileETag None<br></directory>
- 注意:禁用 ETag 后,若未配置
Last-Modified,协商缓存将退化为每次返回 200,失去优化效果。
ETag 和 Last-Modified 如何协同工作
Apache 通常同时输出 ETag 和 Last-Modified。两者共存时:
- 客户端可任选其一做验证(多数现代浏览器优先用 ETag);
- 服务器端验证逻辑独立:收到
If-None-Match就查 ETag,收到If-Modified-Since就查时间戳; - 二者无依赖关系,但建议保留
Last-Modified作为 ETag 不可用时的兜底方案(比如禁用了 ETag 但忘了关时间戳)。









