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

Apache mod_cache 默认只缓存 HTTP 200(OK)响应,对其他状态码如 301、302、404、500 等默认不缓存,除非显式配置允许。
哪些状态码默认可缓存?
mod_cache 的核心缓存策略依赖于 RFC 7234 的语义规则,并结合模块自身的默认行为:
-
200 OK:默认缓存,前提是响应头中包含有效的缓存控制字段(如
Cache-Control或Expires) -
203 Non-Authoritative Information、206 Partial Content、300 Multiple Choices、301 Moved Permanently、302 Found:理论上可缓存,但
mod_cache默认 不缓存,需通过CacheIgnoreNoLastMod或自定义CacheIgnoreHeaders配合响应头策略启用 -
404 Not Found:默认不缓存;若需缓存(例如减少后端查询压力),必须显式配置
CacheIgnoreNoLastMod On并确保响应含Cache-Control: public, max-age=300等有效指令 -
5xx 错误(如 500、502、503):默认禁止缓存;即使设置了
Cache-Control,mod_cache也会跳过,因其被视作不可靠的临时响应
如何让非200响应进入缓存?
关键在于两步:一是放宽状态码限制,二是确保响应携带合法缓存元数据:
- 使用
CacheIgnoreNoLastMod On:绕过对Last-Modified或ETag头的强制要求(这对 404 等无实体头的响应很关键) - 在应用层返回明确的缓存指令,例如:
Cache-Control: public, max-age=60(允许代理和客户端缓存 60 秒) - 对重定向(301/302),需确认后端未设置
Cache-Control: no-store或private;否则mod_cache会尊重该指令而跳过缓存 - 避免依赖
Expires单独存在——若无Last-Modified或ETag,且未启用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: HIT或X-Cache: MISS(需启用mod_headers并配置Header set X-Cache "HIT" env=cache_hit) - 查看 Apache error_log 中 cache 模块日志(开启
CacheLock on和LogLevel cache:trace4) - 观察磁盘缓存目录(
CacheRoot)下是否有对应 URL 的缓存文件生成 - 用
curl -I多次请求同一资源,对比Date、Age、X-Cache字段变化










