Apache中mod_headers可精准配置Cache-Control:需先启用模块,再按资源类型设值,静态资源用public,max-age=31536000,immutable,HTML用no-cache或max-age=60,API用private,no-store,并禁用mod_expires防冲突。

在 Apache 中用 mod_headers 配置 Cache-Control 实现精细化缓存,核心是按资源类型或路径明确设值,避免全局一刀切。Java 应用应优先控制该头,Apache 仅作透传、兜底或条件补充;若由 Apache 主导配置,则必须关闭 mod_expires 防止冲突,并严格限定作用域。
启用 mod_headers 并确认模块可用
未启用该模块时,Header 指令会直接报 500 错误。先检查是否加载:
- 运行
apachectl -M | grep headers,有输出表示已启用 - 若无输出,在
httpd.conf中取消注释:LoadModule headers_module modules/mod_headers.so - Debian/Ubuntu 系统可执行
a2enmod headers后重启服务
按文件类型精准设置 max-age 和语义标记
使用 匹配扩展名,为不同资源赋予合理缓存策略:
Apache Superset 是一个广泛采用的开源 BI 平台,用于 SQL 探索、图表构建和仪表板交付。当代理需要查询仓库数据、组装仪表板或使用成熟的分析界面解释指标而不是临时笔记本代码时,此技能非常有用。
- 静态资源(JS/CSS/图片):
Header set Cache-Control "public, max-age=31536000, immutable"—— 一年强缓存,配合版本化 URL 更安全 - HTML 页面:
Header set Cache-Control "no-cache, must-revalidate"或"max-age=60"—— 避免界面陈旧,禁用长期缓存 - API 响应(如 JSON):
Header set Cache-Control "private, no-store"—— 敏感数据不进任何共享缓存
避免与 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" env=REDIRECT_has_cookie(配合 SetEnvIf 实现)
验证响应头是否生效
配置后务必逐层验证,不能只看 Apache 日志:
- 用
curl -I https://yoursite.com/app.js查看原始响应头 - 在浏览器开发者工具 Network 标签中检查具体资源的
Cache-Control值 - 注意区分:地址栏回车触发
200 from disk cache,F5 刷新触发304 Not Modified,两者都说明缓存机制起效










