DocumentRoot 不直接参与缓存,但它是缓存生效的前提;缓存规则(如 mod_cache 或 mod_expires)必须作用于 DocumentRoot 下可访问的路径,且需配合 Directory 权限、响应头及模块启用才能生效。

DocumentRoot 本身不参与缓存逻辑,但它决定了请求的起点路径,而缓存规则(如 mod_cache 或 mod_expires)需要基于这个路径或其子路径来生效。所以“DocumentRoot 配合缓存”不是直接联动配置,而是通过路径匹配、目录权限和响应头协同工作——关键在于:缓存策略要落在 DocumentRoot 所定义的资源范围内,且必须授权访问才能缓存。
DocumentRoot 是缓存生效的前提
Apache 只会对实际能访问到的文件或响应启用缓存。如果 DocumentRoot 设为 /var/www/example.com,但你试图对 /api/ 缓存,而该路径没映射到 DocumentRoot 下(也没用 Alias 或 ProxyPass 暴露),那缓存规则就压根不会触发。
- 确保你要缓存的 URL 路径,最终能被 Apache 解析为 DocumentRoot 下的真实文件(如
/images/logo.png)或由后端(如 PHP/FastCGI)生成的响应(如/blog/latest) - 若用 Alias 挂载外部目录(比如
Alias /static /mnt/ssd/static),需单独给该路径配<directory></directory>并Require all granted,否则缓存模块连读取都失败 - DocumentRoot 路径末尾不要加斜杠(
/var/www/site✅,/var/www/site/❌),避免路径匹配异常影响 LocationMatch 规则
静态资源缓存:靠 mod_expires + DocumentRoot 路径匹配
对 HTML、CSS、JS、图片等静态文件,最常用的是 mod_expires,它根据文件类型或 URL 路径设置 Expires 和 Cache-Control 响应头。
Apache Superset 是一个广泛采用的开源 BI 平台,用于 SQL 探索、图表构建和仪表板交付。当代理需要查询仓库数据、组装仪表板或使用成熟的分析界面解释指标而不是临时笔记本代码时,此技能非常有用。
- 在
<directory></directory>块内启用:ExpiresActive On - 按扩展名设过期时间,例如:
ExpiresByType image/png "access plus 1 month" - 也可用
<location></location>精确控制某子路径(如 CDN 映射的静态资源目录),只要它属于 DocumentRoot 的子树即可
动态内容缓存:靠 mod_cache + Location 匹配 DocumentRoot 下的路径
对 PHP、Python 或反向代理返回的动态响应(如 /api/v1/users),需用 mod_cache_disk,且缓存指令必须作用于实际被访问的 URL 路径——这个路径通常以 DocumentRoot 为基准解析。
- 写
<locationmatch></locationmatch>时,前提是/api/这个 URL 是由 DocumentRoot 下的脚本(如/var/www/example.com/api/index.php)或 ProxyPass(如指向 localhost:3000)处理的 - 若用
ProxyPass /api http://backend:8000/api,缓存仍可生效,但需确保CacheEnable disk放在<location></location>内,且后端响应带合法Cache-Control: public, max-age=60 - 务必排除含 Cookie 或 POST 的请求:
SetEnvIfNoCase Cookie "(^|;\s*)auth_token=" no_cache,再用CacheEnable disk env=!no_cache
验证与权限:三处不能漏
缓存配置写得再对,缺了这三项也会静默失效:
-
模块启用:确认
a2enmod expires cache cache_disk headers已执行(Ubuntu)或LoadModule行已取消注释(CentOS) -
目录权限:DocumentRoot 对应的
<directory></directory>必须有Require all granted;缓存目录(如/var/cache/apache2)属主要是www-data或apache,且有读写权限 -
响应头检查:用
curl -I https://yoursite.com/test.html看是否返回Expires、Cache-Control或X-Cache: HIT;若没有,说明路径没匹配上或后端覆盖了头信息

















