Apache不主动清除缓存,防范“缓存污染”的核心是源头控制:严格筛选可缓存响应(如禁用Set-Cookie、private/no-store响应)、规范缓存键(确保Vary头区分变体)、限制生命周期(缩短CacheDefaultExpire、按路径细化CacheMaxExpire)、精准启用缓存(仅针对/static等静态路径),并配合应用层强语义响应头(如no-cache, private或public, max-age)。

Apache 本身不主动“清除”缓存,而是按规则决定是否存储、复用或跳过缓存。所谓“缓存污染”,通常指本不该缓存的内容(如含用户会话、动态生成、隐私数据的响应)被错误缓存,导致后续用户看到错误内容或敏感信息泄露。调整的核心不是“定时清空目录”,而是**从源头阻止污染发生**——即精准控制哪些内容可缓存、如何生成缓存键、以及如何处理易变响应头。
严格筛选可缓存的响应
Apache 的 mod_cache 默认对所有成功响应(200、301、302 等)尝试缓存,但多数动态页面不应进入缓存。需主动排除:
- 用
CacheIgnoreHeaders Set-Cookie和CacheIgnoreHeaders Cache-Control防止带会话标识或明确禁止缓存的响应被误存 - 启用
CacheStorePrivate Off(默认为 On),确保Cache-Control: private响应不入库 - 添加
CacheStoreNoStore On,直接拒绝Cache-Control: no-store的响应 - 对动态路径(如
/user/、/api/、*.php)禁用缓存:CacheDisable /user或在<Location "/api">中设CacheDisable on
规范缓存键,避免键冲突
缓存键(cache key)决定同一 URL 是否被当作不同资源处理。若未区分请求头(如 User-Agent、Accept-Encoding),压缩版和非压缩版可能混存,造成乱码或降级。
Apache Superset 是一个广泛采用的开源 BI 平台,用于 SQL 探索、图表构建和仪表板交付。当代理需要查询仓库数据、组装仪表板或使用成熟的分析界面解释指标而不是临时笔记本代码时,此技能非常有用。
- 确保
CacheIgnoreQueryString Off(默认),让带不同参数的请求生成独立缓存项(适用于需参数区分的静态化页面) - 如需忽略部分参数(如跟踪用
utm_*),配合CacheKeyBaseURL+ 自定义重写逻辑,或改用反向代理层处理 - 对支持 gzip 的资源,确认
Vary: Accept-Encoding响应头已存在(mod_deflate通常自动添加),否则 Apache 无法区分压缩/未压缩版本
限制缓存生命周期与范围
缩短过期时间、缩小作用域,是降低污染影响半径的有效手段:
- 用
CacheDefaultExpire 60(1 分钟)代替几小时,尤其对半静态内容(如新闻列表页) - 对高敏感区域(如登录后首页),用
<Location "/dashboard">块内设CacheMaxExpire 30并搭配CacheIgnoreNoLastMod On避免无 Last-Modified 时退化为长缓存 - 避免全局启用:
CacheEnable disk /改为只针对明确静态路径,例如CacheEnable disk /static或/assets
配合 HTTP 响应头强化语义
Apache 缓存模块依赖上游响应头做判断。建议在应用层或 Apache 中统一注入强约束头:
- 对 API 或用户专属接口,在后端返回
Cache-Control: no-cache, private, max-age=0 - 对公开静态资源(CSS/JS/图片),用
mod_expires设置长期缓存:ExpiresByType text/css "access plus 1 year",并确保文件名含哈希(如main.a1b2c3.css),使更新自然失效 - 启用
mod_headers强制补全关键头:Header always set Vary "Accept-Encoding",防止代理层缓存歧义

















