Apache本身不生成ETag,而是透传后端应用(如Java/PHP)提供的ETag值并参与If-None-Match协商返回304;应禁用FileETag None,由后端基于内容哈希、时间戳或版本号精准生成ETag,避免inode/mtime等不稳定字段导致缓存失效。

Apache 本身不生成 ETag,而是依赖后端应用(如 Java、PHP)提供并返回 ETag 值,再由 Apache 负责透传请求头(If-None-Match)、参与协商、返回 304 响应。真正提升性能的关键,在于让 ETag 准确反映资源状态变化,并配合浏览器缓存行为减少重复传输。
确保后端正确生成有意义的 ETag
ETag 必须随内容真实变化而更新,否则会破坏缓存一致性。固定值、随机数或 session 相关字段都不合适。
- 对 JSON/API 响应:用响应体内容做 SHA-256 或 MD5 哈希,取前 8 位加
W/前缀,例如W/"a1b2c3d4" - 对数据库驱动页面:取关键记录的
updated_at时间戳哈希,如"e9a7b5f2" - 对模板渲染页:结合版本号与最后修改时间,如
"v2.3-20260610" - 避免使用文件 inode、大小或 mtime —— Apache 默认的
FileETag在集群或多服务器环境下不可靠
在 Apache 中禁用默认 ETag 并透传自定义值
Apache 默认启用 FileETag(基于文件属性生成),这在负载均衡或容器化部署中会导致不同节点生成不同 ETag,使缓存失效。应显式关闭并信任后端提供的值。
Apache Superset 是一个广泛采用的开源 BI 平台,用于 SQL 探索、图表构建和仪表板交付。当代理需要查询仓库数据、组装仪表板或使用成熟的分析界面解释指标而不是临时笔记本代码时,此技能非常有用。
- 在主配置或虚拟主机中添加:
FileETag None - 确保响应头能被正常透传:确认没有规则用
Header unset ETag或拦截了响应头 - 若用反向代理(如 Apache 做前端网关),需开启
ProxyPass相关 header 透传,例如:ProxyPreserveHost On
配合 Last-Modified 和 Cache-Control 构成完整验证链
ETag 是强校验,Last-Modified 是弱校验,两者共存可提升兼容性;而 Cache-Control 决定是否进入协商流程。
- 后端响应中同时设置:
ETag+Last-Modified(如Sat, 13 Jun 2026 08:00:00 GMT) - 浏览器首次请求后,缓存资源并记住这两个值;后续请求自动带上
If-None-Match和If-Modified-Since - Apache 不需要额外逻辑——只要后端返回了匹配的 ETag,且请求含
If-None-Match,它就会返回 304 - 搭配
Cache-Control: public, max-age=3600,让资源在 1 小时内直接走本地缓存,过期后再触发协商
验证是否生效及常见陷阱
实际效果需通过开发者工具 Network 面板观察请求状态码和响应头,而非仅看配置是否写上。
- 检查响应头是否有
ETag,且值不为空、不重复、不固定 - 第二次请求应带
If-None-Match,响应状态码为304 Not Modified,响应体为空 - 注意 Spring Boot 等框架默认不启用 ETag,需手动设置或注册
ShallowEtagHeaderFilter(但大响应慎用,因需缓冲全文) - CDN 或中间代理可能剥离或覆盖 ETag,需确认其缓存策略是否保留该头部


















