apache虚拟主机中实现细粒度缓存控制,核心是结合mod_cache、mod_cache_disk和mod_headers模块,按路径、文件类型、响应头特征进行差异化策略配置:启用模块后,创建并授权缓存目录;在全局配置中定义cacheroot等基础参数;在内用为/static/、/api/、/images/等路径分别设置缓存启用、禁用或强缓存头;用对.js/.css设immutable长期缓存,对.html设短时private缓存;配合cacheignorequerystring、vary及mod_expires提升兼容性与智能性。

在 Apache 虚拟主机中实现细粒度缓存控制,核心是结合 mod_cache、mod_cache_disk 和 mod_headers 模块,按路径、文件类型、响应头特征进行差异化策略配置,而非全局一刀切。
启用并初始化缓存模块
确保以下模块已启用(Debian/Ubuntu 推荐用命令,RHEL/CentOS 可手动编辑 httpd.conf):
sudo a2enmod cache cache_disk headers expires- 创建缓存根目录并赋权:
sudo mkdir -p /var/cache/apache2/mod_cache_disk && sudo chown www-data:www-data /var/cache/apache2/mod_cache_disk - 在虚拟主机配置外(如
/etc/apache2/conf-available/cache.conf)统一定义基础缓存区:
CacheRoot "/var/cache/apache2/mod_cache_disk"
CacheDirLevels 2
CacheDirLength 1
CacheIgnoreHeaders Set-Cookie Cache-Control
CacheIgnoreNoLastMod On
按路径启用不同缓存策略
在 <virtualhost></virtualhost> 内部,用 <location></location> 精确控制每个子路径:
Apache Superset 是一个广泛采用的开源 BI 平台,用于 SQL 探索、图表构建和仪表板交付。当代理需要查询仓库数据、组装仪表板或使用成熟的分析界面解释指标而不是临时笔记本代码时,此技能非常有用。
- /static/(静态资源):启用磁盘缓存 + 长期过期
CacheEnable disk /
CacheDefaultExpire 604800
CacheMaxExpire 2592000
-
/api/(动态接口):禁用缓存,或仅缓存只读 GET 请求(需配合
CacheIgnoreHeaders和条件判断)
# 不启用 CacheEnable,即默认不缓存
Header always set Cache-Control "no-store, no-cache, must-revalidate"
- /images/(图片):额外设置强缓存头
CacheEnable disk /
CacheDefaultExpire 2592000
Header always set Cache-Control "public, max-age=2592000, immutable"
按文件后缀定制缓存行为
使用 <filesmatch></filesmatch> 对特定扩展名做精细干预:
- JavaScript 和 CSS:设为长期缓存,但要求客户端校验(
immutable防止重复请求)
Header always set Cache-Control "public, max-age=31536000, immutable"
- HTML 页面:短时缓存 + 强制校验(避免内容 stale)
Header always set Cache-Control "private, max-age=1800, must-revalidate"
- 带查询参数的资源(如
?v=1.2.3):默认不缓存,除非明确允许
CacheIgnoreQueryString Off # 允许缓存带 query string 的请求(需谨慎)
配合 Expires 和 Vary 实现更智能控制
对需要多版本适配的内容(如移动端/桌面端),用 Vary 头隔离缓存:
- 例如区分
User-Agent或Accept-Encoding:
CacheEnable disk /
Header always set Vary "User-Agent, Accept-Encoding"
- 同时启用
mod_expires提供兼容性更好的过期时间(尤其对老旧客户端):
ExpiresActive On
ExpiresByType image/jpg "access plus 1 month"
ExpiresByType text/css "access plus 1 week"
配置完成后执行 sudo systemctl restart apache2,再用 curl -I https://yoursite.com/static/logo.png 检查响应头是否含预期的 Cache-Control 和 Expires 字段。注意缓存生效需满足:响应状态码为 200/304、无 Set-Cookie、有 Last-Modified 或 ETag —— 这些细节决定了 Apache 是否真正写入磁盘缓存。









