Apache虚拟主机中配置CacheEnable缓存需结合路径控制、响应头干预与生命周期管理,仅启用模块不够;应限定缓存范围、强制设置public Cache-Control、排除敏感路径,并用curl验证X-Cache与响应头。

Apache 虚拟主机中配置 CacheEnable 的缓存过期策略,核心不是简单写一句 CacheEnable disk / 就完事,而是要结合路径控制、响应头干预和缓存生命周期管理,尤其对动态内容(如 PHP 页面、API 接口)必须精准干预。默认情况下,Apache 会跳过带 Set-Cookie、Cache-Control: no-cache 或 private 的响应,所以光靠模块启用远远不够。
在虚拟主机内启用并限定缓存范围
不要在全局配置里直接 CacheEnable disk /,容易误缓存后台、登录页或含敏感数据的路径。应在 <VirtualHost> 块内按需启用,例如只缓存公开博客列表:
<VirtualHost *:80>
ServerName example.com
DocumentRoot /var/www/html
<IfModule mod_cache.c>
<IfModule mod_cache_disk.c>
CacheRoot /var/cache/apache2/example-com-disk
CacheDirLevels 2
CacheDirLength 1
CacheIgnoreHeaders Set-Cookie
CacheIgnoreNoLastMod On
CacheDefaultExpire 300
</IfModule>
</IfModule>
# 仅对 /blog/ 下的响应启用磁盘缓存
<Location "/blog/">
CacheEnable disk
CacheMaxExpire 600
CacheMinExpire 180
</Location>
</VirtualHost>注意:CacheEnable disk 在 <Location> 内生效时,不带路径参数(即不能写 CacheEnable disk /blog/),它继承外层 CacheRoot 并作用于该 Location 匹配的所有请求。
强制统一响应头,覆盖后端干扰
PHP 或后端框架常输出 Cache-Control: no-cache 或 private,Apache 必须在发给客户端前重写。需启用 mod_headers,并在同一 <Location> 下注入可信头:
<IfModule mod_headers.c>
<Location "/blog/">
Header unset Cache-Control
Header unset Expires
Header set Cache-Control "public, max-age=600"
Header set Vary "Accept-Encoding"
</Location>
</IfModule>-
public是关键,缺了它即使max-age=600也不会被共享缓存(包括 Apache 自身的mod_cache)接受; -
Vary: Accept-Encoding必须加上,否则 gzip 和非压缩版本会互相覆盖导致乱码; - 若页面含用户身份信息(如欢迎语),改用
private, max-age=300更安全。
排除不适宜缓存的路径
用 CacheDisable 明确关闭高风险路径,比依赖 CacheIgnoreHeaders 更可靠:
<Location "/admin/">
CacheDisable
</Location>
<Location "/user/">
CacheDisable
</Location>
<LocationMatch "^/(login|logout|api/v1/user)">
CacheDisable
</LocationMatch>这些路径即使返回 200 OK 且无 Set-Cookie,也不应进入缓存,避免状态错乱。
Apache 2.4.62 官方 tar.gz 源码包是 Linux 及类 Unix 系统构建 Web 服务器的核心基础。通过源码编译安装,开发者能够灵活定制模块、优化性能并精准控制安装路径,满足多样化的业务需求。
验证是否真正生效
配置完成后重启 Apache,并用 curl -I 检查真实响应头:
curl -I https://example.com/blog/latest.php
确认返回中同时包含:
-
X-Cache: HIT或X-Cache: MISS(由mod_cache注入,表明模块已介入); -
Cache-Control: public, max-age=600(你设定的值); - 无
Set-Cookie(或虽有但已被CacheIgnoreHeaders忽略); - 状态码是
200(404、500默认不缓存,不可强行开启)。
不复杂但容易忽略。

















