Java中Apache中mod_cache对不同HTTP状态码的缓存逻辑

1次阅读

默认仅200 OK响应可缓存,前提是含有效Cache-Control或Expires头;其他状态码如301、302、404、5xx等均不缓存,除非显式配置CacheIgnoreNoLastMod及合法缓存头。

Java中Apache中mod_cache对不同HTTP状态码的缓存逻辑

apache mod_cache 默认只缓存 http 200(OK)响应,对其他状态码如 301、302、404、500 等默认不缓存,除非显式配置允许。

哪些状态码默认可缓存?

mod_cache 的核心缓存策略依赖于 RFC 7234 的语义规则,并结合模块自身的默认行为:

  • 200 OK:默认缓存,前提是响应头中包含有效的缓存控制字段(如 Cache-ControlExpires
  • 203 Non-Authoritative Information206 Partial Content300 Multiple Choices301 Moved Permanently302 Found:理论上可缓存,但 mod_cache 默认 不缓存,需通过 CacheIgnoreNoLastMod 或自定义 CacheIgnoreHeaders 配合响应头策略启用
  • 404 Not Found:默认不缓存;若需缓存(例如减少后端查询压力),必须显式配置 CacheIgnoreNoLastMod On 并确保响应含 Cache-Control: public, max-age=300 等有效指令
  • 5xx 错误(如 500、502、503):默认禁止缓存;即使设置了 Cache-Controlmod_cache 也会跳过,因其被视作不可靠的临时响应

如何让非200响应进入缓存?

关键在于两步:一是放宽状态码限制,二是确保响应携带合法缓存元数据:

  • 使用 CacheIgnoreNoLastMod On:绕过对 Last-ModifiedETag 头的强制要求(这对 404 等无实体头的响应很关键)
  • 在应用层返回明确的缓存指令,例如:
    Cache-Control: public, max-age=60(允许代理和客户端缓存 60 秒)
  • 对重定向(301/302),需确认后端未设置 Cache-Control: no-storeprivate;否则 mod_cache 会尊重该指令而跳过缓存
  • 避免依赖 Expires 单独存在——若无 Last-ModifiedETag,且未启用 CacheIgnoreNoLastMod,仍不会缓存

实际配置示例(httpd.conf)

以下配置允许缓存 404 和 301 响应(需配合后端输出相应 Cache-Control):

立即学习Java免费学习笔记(深入)”;

CacheRoot "/var/cache/apache2" CacheEnable disk / CacheIgnoreNoLastMod On CacheIgnoreCacheControl Off  # 允许遵守后端 Cache-Control 指令 # 可选:显式排除某些状态码(如禁用 503 缓存) # CacheIgnoreStatus 503

注意:CacheIgnoreCacheControl Off 是关键——设为 On 会忽略所有 Cache-Control,导致无法按需控制非 200 响应的缓存行为。

调试与验证方法

确认某响应是否被缓存,可检查三方面:

  • 响应头中是否出现 X-Cache: HITX-Cache: MISS(需启用 mod_headers 并配置 Header set X-Cache "HIT" env=cache_hit
  • 查看 Apache error_log 中 cache 模块日志(开启 CacheLock onLogLevel cache:trace4
  • 观察磁盘缓存目录(CacheRoot)下是否有对应 URL 的缓存文件生成
  • curl -I 多次请求同一资源,对比 dateAgeX-Cache 字段变化

text=ZqhQzanResources