可缓存404响应,需显式配置proxy_cache_valid 404 1m、启用proxy_intercept_errors on,并设置精确的proxy_cache_key(如"$scheme$request_method$host$request_uri$args"),配合日志与响应头验证命中状态。

可以利用 proxy_cache_valid 指令对 404 响应进行缓存,从而避免上游服务反复处理相同路径的无效请求,缓解“请求穿透”压力。关键在于显式声明 404 状态码及其缓存时间,并确保缓存键(proxy_cache_key)能准确区分不同请求路径。
明确配置 404 的缓存规则
proxy_cache_valid 默认只缓存 200、301、302 响应,404 不在默认列表中,必须手动指定:
- 在
location或server块中添加:proxy_cache_valid 404 1m;—— 表示将 404 响应缓存 1 分钟 - 可同时定义多个状态码,例如:
proxy_cache_valid 200 301 302 10m; proxy_cache_valid 404 30s; - 注意:缓存时间不宜过长(如超过 5 分钟),否则新资源上线后用户仍会持续收到旧的 404,影响可用性
确保缓存键能正确区分 404 请求
若 proxy_cache_key 中未包含完整 URI 或忽略查询参数,可能导致不同路径的 404 相互覆盖或误命中:
- 推荐使用较精确的 key,例如:
proxy_cache_key "$scheme$request_method$host$request_uri"; - 如果业务需区分参数(如
/api/item?id=123和/api/item?id=456),务必保留$args:proxy_cache_key "$scheme$request_method$host$request_uri$args"; - 避免使用过于宽泛的 key(如仅用
$uri),否则带参与不带参请求可能共用一个缓存项
配合 proxy_intercept_errors 启用错误页面接管
仅靠 proxy_cache_valid 404 不足以让 Nginx 缓存并返回 404——上游返回 404 时,Nginx 默认直接透传,不会进入缓存流程。必须启用错误拦截:
- 添加:
proxy_intercept_errors on; - 该指令允许 Nginx 将上游返回的 404 视为可处理的响应,进而触发缓存逻辑
- 注意:开启后,若未配置
error_page 404,Nginx 仍会返回默认 404 页面;但只要响应体被缓存,后续相同请求就会直接从缓存返回,无需再连上游
验证与调试技巧
部署后可通过日志和响应头确认缓存是否生效:
- 开启
log_format记录缓存状态,例如:log_format cache '$remote_addr - $upstream_cache_status ...';
查看日志中是否出现MISS(首次请求)、EXPIRED(过期重查)、HIT(命中缓存 404) - 用
curl -I检查响应头:
命中缓存的 404 会带X-Cache: HIT(自定义 header)或Age头非零值 - 临时将缓存时间设为 10s,用两次 curl 间隔 5s 测试是否第二次直接返回(无 upstream 日志)











