Apache缓存需分级控制动静态资源:静态文件长期缓存+指纹化路径,动态页面禁用服务端缓存仅用ETag协商,伪动态内容可设5分钟公共缓存,并通过CacheIgnoreHeaders规避干扰头,结合主动purge与业务语义驱动失效。
apache 本身不生成动态内容,但作为反向代理或直连后端时,缓存失效策略直接影响动态与静态资源的协同效率。关键不是“全缓存”或“不缓存”,而是按内容特征分级控制、精准失效、避免冲突。
区分动静内容,设置不同缓存生命周期
静态资源(CSS/JS/图标)和动态响应(API JSON、用户页HTML)应走不同路径:
- 对 CSS/JS 等不变文件,用 mod_expires 设置长期缓存(如
ExpiresDefault "access plus 1 year"),配合指纹化路径(app.a1b2c3.js),让浏览器永久复用 - 对动态页面(如
/user/dashboard),禁用服务端缓存,仅允许客户端协商缓存(ETag+If-None-Match),由后端在响应头中动态生成校验值 - 对“伪动态”内容(如商品详情页、天气接口),若变化频率低且可容忍延迟,用
Cache-Control: public, max-age=300在 Apache 层缓存 5 分钟,减轻后端压力
用 CacheIgnoreHeaders 避免缓存被意外绕过
后端常为动态响应设置 Set-Cookie 或 Cache-Control: private,导致 Apache 的 mod_cache 默认跳过缓存。可在配置中显式忽略干扰头:
Apache Superset 是一个广泛采用的开源 BI 平台,用于 SQL 探索、图表构建和仪表板交付。当代理需要查询仓库数据、组装仪表板或使用成熟的分析界面解释指标而不是临时笔记本代码时,此技能非常有用。
-
CacheIgnoreHeaders Set-Cookie—— 允许缓存含登录态 Cookie 的响应(适用于无敏感信息的公共页) -
CacheIgnoreHeaders Cache-Control—— 忽略后端返回的 Cache-Control,统一由 Apache 控制缓存行为(需确保后端不返回强私有策略) - 慎用
CacheIgnoreHeaders Vary;若后端按Accept-Encoding或User-Agent返回不同版本,忽略它会导致缓存污染
主动失效比被动过期更可控
依赖 max-age 等待自然过期,在内容更新后会造成 N 分钟的陈旧窗口。推荐结合以下方式主动干预:
- 对磁盘缓存(mod_cache_disk),用
cache purge指令或脚本删除特定 URL 对应的缓存文件(需启用 mod_cache_socache 并配置 socache 提供器) - 对前端触发的更新(如 CMS 发布文章),让后端在成功写入后,向 Apache 发送 HTTP PURGE 请求(需启用 mod_cache 和自定义
LocationMatch规则放行) - 对静态资源变更,不改文件名就清缓存容易出错;坚持用构建工具生成带哈希的文件名,让旧缓存自然失效,无需人工干预
协同后端,把失效逻辑前移到应用层
Apache 缓存只是最后一环,真正决定“何时失效”的应是业务语义。例如:
- 用户修改个人资料后,后端可主动调用缓存清理接口,或向消息队列发事件,由独立服务批量刷新 Apache 缓存目录
- 订单状态页这类强时效内容,Apache 不缓存,但后端可对查询结果做内存级缓存(如 Caffeine),并监听数据库 binlog 或使用 Redis Pub/Sub 实时失效
- 若使用 CDN,Apache 应只负责回源缓存,CDN 层配置更短的 TTL,并支持通过 API 主动刷新,形成多级失效链路

















