Apache默认不缓存动态内容,需启用mod_cache_disk、忽略Set-Cookie头、配置CacheEnable disk及Headers模块覆盖响应头,并通过Location精准控制路径缓存策略。

Apache 默认不对动态内容(比如 PHP、CGI 生成的 HTML)做缓存,因为这类响应通常带有 Cache-Control: no-cache 或 Set-Cookie 头,会被 mod_cache 主动跳过。要真正生效,得同时控制缓存行为和响应头,不能只靠 Expires 或 Cache-Control 单独设置。
启用并配置 mod_cache_disk 基础缓存
这是缓存动态内容的前提,必须用磁盘缓存模块来落地存储:
- 启用模块:
sudo a2enmod cache cache_disk headers expires - 创建缓存目录并赋权:
sudo mkdir -p /var/cache/apache2/dynamic && sudo chown www-data:www-data /var/cache/apache2/dynamic - 在虚拟主机或主配置中加入以下核心配置:
<IfModule mod_cache.c>
<IfModule mod_cache_disk.c>
CacheRoot /var/cache/apache2/dynamic
CacheEnable disk /
CacheDirLevels 2
CacheDirLength 1
CacheIgnoreHeaders Set-Cookie Vary
CacheIgnoreNoLastMod On
CacheDefaultExpire 300
</IfModule>
</IfModule>
注意:CacheIgnoreHeaders Set-Cookie 是关键——否则带登录态的页面一律不缓存;CacheDefaultExpire 300 表示默认缓存 5 分钟,后续可按路径覆盖。
为特定动态路径设置缓存有效期
直接对 /api/ 或 /news/ 这类动态接口路径精准控制,比全局设置更安全:
- 用
<Location>匹配路径,例如缓存所有/blog/下的 PHP 页面 10 分钟:
<Location "/blog/">
CacheEnable disk
CacheIgnoreHeaders Set-Cookie
CacheMaxExpire 600
CacheMinExpire 300
</Location>
Apache Superset 是一个广泛采用的开源 BI 平台,用于 SQL 探索、图表构建和仪表板交付。当代理需要查询仓库数据、组装仪表板或使用成熟的分析界面解释指标而不是临时笔记本代码时,此技能非常有用。
其中 CacheMaxExpire 和 CacheMinExpire 共同划定实际缓存窗口,避免因 Last-Modified 或 ETag 导致过早失效。
配合 headers 模块强制覆盖响应头
后端脚本(如 PHP)可能输出了 no-cache,必须用 Apache 在输出前重写:
- 清除原有干扰头:
Header unset Cache-Control、Header unset Expires - 统一注入强缓存策略(适用于无用户态的公开动态页):
<IfModule mod_headers.c>
<Location "/blog/">
Header set Cache-Control "public, max-age=600"
Header set Vary "Accept-Encoding"
</Location>
</IfModule>
加 Vary: Accept-Encoding 是为了兼容 gzip 压缩变体;若页面含用户个性化内容,改用 private, max-age=300 更稳妥。
验证与调试要点
配置完别急着重启,先检查是否生效:
- 访问目标 URL,用浏览器开发者工具看响应头:确认出现
X-Cache: HIT或X-Cache-Detail(需开启CacheIgnoreHeaders后才显示) - 首次请求应为
MISS,刷新后变为HIT,且Age头数值递增 - 如果始终是
BYPASS,常见原因是响应含Set-Cookie但没设CacheIgnoreHeaders,或 PHP 脚本调用了session_start()
动态缓存不是“开箱即用”,它依赖路径粒度控制 + 头部清理 + 后端配合。稳住这三点,5 分钟到 1 小时级的缓存就能可靠跑起来。

















