Apache缓存控制应优先使用mod_headers模块按资源类型设置Cache-Control:静态资源设为public,max-age=31536000,immutable;HTML设no-cache,must-revalidate;API设private,no-store;需启用mod_headers、禁用mod_expires,并用FilesMatch/LocationMatch精准匹配作用域。

Apache 缓存控制头的核心是用 mod_headers 模块精准设置 Cache-Control,而不是依赖过时的 Expires 头。关键在于按资源类型区别对待,避免全局统一配置。
确认并启用 mod_headers 模块
很多 Apache 默认未启用该模块,直接写 Header 指令会报 500 错误。
- 检查是否已加载:
apachectl -M | grep headers,有输出说明已启用 - Ubuntu/Debian 系统:运行
a2enmod headers && systemctl reload apache2 - RHEL/CentOS 系统:编辑
httpd.conf,取消注释LoadModule headers_module modules/mod_headers.so,再重载服务
按文件类型设置 Cache-Control 值
不同资源语义不同,缓存策略必须分层设计,不能一刀切。
Apache Superset 是一个广泛采用的开源 BI 平台,用于 SQL 探索、图表构建和仪表板交付。当代理需要查询仓库数据、组装仪表板或使用成熟的分析界面解释指标而不是临时笔记本代码时,此技能非常有用。
-
静态资源(JS/CSS/图片/字体):用
public, max-age=31536000, immutable——一年强缓存,配合哈希版本号 URL 更安全 -
HTML 页面:设为
no-cache, must-revalidate或max-age=60——禁用长期缓存,防止界面陈旧 -
API 接口(如 /api/ 路径):用
private, no-store或private, max-age=60——敏感数据不进共享缓存
用 FilesMatch 或 LocationMatch 精准限定作用域
避免影响不该缓存的响应,比如把 HTML 也套上 immutable 就会出问题。
- 匹配扩展名:
<FilesMatch "\.(js|css|png|jpg|gif|woff2)$">Header set Cache-Control "public, max-age=31536000, immutable"</FilesMatch> - 匹配路径:
<LocationMatch "^/api/">Header set Cache-Control "private, no-store"</LocationMatch> - HTML 单独处理:
<FilesMatch "\.html?$">Header set Cache-Control "no-cache, must-revalidate"</FilesMatch>
禁用 mod_expires 并做安全兜底
mod_expires 生成的 Expires 头可能与 Cache-Control 冲突,建议彻底关闭。
- 注释掉或删除
LoadModule expires_module行 - 对 Java 应用未覆盖的路径(如异常响应、过滤器遗漏资源),加默认兜底:
Header always set Cache-Control "public, max-age=3600" - 当请求带 Cookie 时,强制降级为私有缓存:
Header edit Cache-Control "(?i)^public" "private" expr=%{HTTP_COOKIE} != ""
配置后务必用 curl -I 和浏览器开发者工具 Network 标签页逐个验证,注意是否有多个 Cache-Control 行(说明被重复设置或覆盖)。

















