Apache中Header指令用于精细化控制Cache-Control,核心是透传、补充或条件调整后端已设策略,需启用mod_headers、禁用mod_expires,按资源类型用FilesMatch/Location设置不同值,并用edit/merge实现条件增强,最后逐层验证。

在 Apache 中用 Header 指令做 Cache-Control 精细化控制,核心不是让 Apache “决定”怎么缓存,而是让它准确透传、补充或条件性调整 Java 等后端应用已设好的缓存策略。关键在于分工明确:Java 应用按资源语义写头,Apache 负责兜底、过滤和安全加固。
确保 mod_headers 已启用且无冲突
Header 指令依赖 mod_headers 模块,未启用会直接报 500 错误。先验证:
- 运行
apachectl -M | grep headers,有输出说明已加载 - 若无输出,在 Debian/Ubuntu 上执行
a2enmod headers;在 CentOS/RHEL 或源码安装环境,检查httpd.conf中是否取消了#LoadModule headers_module modules/mod_headers.so的注释 - 禁用
mod_expires(如已启用),避免它自动生成 Expires 和冲突的 Cache-Control,统一由 Header 指令管理
按资源类型精准设置 Cache-Control 值
不要全局设一个值。用 或 限定作用域,匹配不同后缀或路径:
Apache Superset 是一个广泛采用的开源 BI 平台,用于 SQL 探索、图表构建和仪表板交付。当代理需要查询仓库数据、组装仪表板或使用成熟的分析界面解释指标而不是临时笔记本代码时,此技能非常有用。
- 静态资源(JS/CSS/图片/字体):
<filesmatch><br> Header set Cache-Control "public, max-age=31536000, immutable"<br></filesmatch>
- HTML 页面(服务端渲染):
<locationmatch><br> Header set Cache-Control "no-cache, private, must-revalidate"<br></locationmatch>
- API 接口(含登录态):
<location><br> Header set Cache-Control "private, max-age=60, must-revalidate"<br></location>
用 Header edit / merge 实现条件化增强
当需要根据请求特征动态调整已有头时,edit 和 merge 更安全:
- 对带 Cookie 的请求,强制把 public 改为 private(防代理缓存敏感响应):
Header edit Cache-Control "(?i)^public" "private" "expr=%{HTTP_COOKIE} != ''" - 为已含
max-age=31536000的响应追加immutable和stale-while-revalidate:Header merge Cache-Control "immutable, stale-while-revalidate" "expr=%{resp:Cache-Control} =~ m/max-age=31536000/" - 为所有未设 Cache-Control 的响应兜底(如某些过滤器遗漏):
Header always set Cache-Control "public, max-age=3600" "expr=%{resp:Cache-Control} == ''"
验证与调试要点
缓存行为最终由浏览器和中间节点共同执行,配置后必须逐层验证:
- 用
curl -I https://yoursite.com/xxx.js查看原始响应头,确认 Cache-Control 出现在最终响应中 - 检查是否有其他模块(如 mod_proxy、CDN、Spring Security 过滤器)覆盖或清空了该头
- 浏览器开发者工具 Network 标签页中,观察
x-cache、age、cf-cache-status(Cloudflare)等辅助字段,判断是否真被缓存 - 修改资源后不改 URL 时,
immutable会让浏览器跳过验证——务必配合版本化路径(如app.a1b2c3.js)使用










