Apache不直接生成Cache-Control头,而是由Java应用按资源类型精细化设置(如静态资源设immutable、私有数据禁用共享缓存),Apache仅透传、兜底或条件重写;需关闭mod_expires避免冲突,调试时须逐层验证响应头。
Apache 本身不直接生成或修改
响应头,它依赖模块(如
、
)或后端应用(如 Java Web 应用)来设置。在 Java 中利用 Apache 作为反向代理时,“精细化控制缓存”实际是:Java 应用负责生成符合业务逻辑的
头,Apache(配合配置)负责透传、增强或条件性覆盖这些头——而非替代 Java 做决策。
Java 应用侧:按资源类型主动设 Cache-Control
不要依赖容器默认行为。在 Spring Boot、Servlet 或 JAX-RS 中,显式设置响应头是最可靠的方式:
静态资源(JS/CSS/图片)
:用强缓存 + 版本化路径,例如
(一年,且内容不变)
用户私有数据(如 /api/profile)
:禁用共享缓存,防代理缓存敏感内容:
带登录态但可短时缓存的 API(如 /api/dashboard)
:允许客户端缓存,但强制校验新鲜度:
HTML 页面(服务端渲染)
:通常禁用缓存或设极短有效期,避免 stale UI:
Apache 配置侧:透传、补充与安全兜底
启用
后,在
或
中操作:
确保 Java 设置的头不被覆盖
:默认 Apache 不会覆写已存在的
,但若用了
等,可能冲突。建议关闭
,统一由 Java 控制
为未设置头的资源兜底
:对 Java 未显式设头的路径(如某些过滤器遗漏),添加默认策略:
Header always set Cache-Control "public, max-age=31536000, immutable"
移除或重写不安全头值
:例如禁止外部缓存含 Cookie 的请求响应:
Header edit Cache-Control "(?i)public" "private"
(仅当请求含 Cookie 时)
注意代理链中的缓存语义一致性
Apache 作反向代理(
)时,它自身也具备缓存能力(
),但这与
控制的是不同层级:
立即学习
“
Java免费学习笔记(深入)
”;
是 HTTP 协议级指令,指导所有中间节点(CDN、浏览器、代理)是否及如何缓存
是 Apache 自身的磁盘/内存缓存,它
尊重
响应中的
(如
会跳过缓存),但不会“实现”该头——它只是消费者
若需 Apache 主动缓存,必须同时满足:
响应含可缓存头
(如
或无
)、
Apache 配置启用 cache 和 cache-disk
、
URL 匹配缓存规则
调试与验证关键点
仅靠代码设置不等于生效。务必逐层验证:
用
检查 Java 响应头是否正确发出
通过 Apache 访问时再 curl,确认头未被意外修改或删除(可用
临时回显)
检查浏览器 DevTools → Network → Headers → Response Headers,关注
、
(若 Apache 启用 mod_cache)等辅助字段
对 CDN 或公司代理环境,确认它们未根据自有规则覆盖或忽略你的
Cache-Controlmod_headersmod_expiresCache-ControlCache-Control: public, max-age=31536000, immutableCache-Control: private, no-store, no-cacheCache-Control: private, max-age=60, must-revalidateCache-Control: no-cache, no-store, must-revalidatemod_headersVirtualHost.htaccessCache-ControlExpiresActive Onmod_expiresmod_proxymod_cacheCache-ControlCache-Controlmod_cacheCache-Controlno-storepublicprivatecurl -I http://your-app/pathHeader echo Cache-ControlAgeX-CacheCache-Control