直接在proxy_cache_valid中写明404 60s即可开启负向缓存,但必须配合启用proxy_cache、定义缓存区、配置proxy_ignore_headers忽略后端Cache-Control/Expires头等前提,否则Nginx默认不缓存404响应。

直接在 proxy_cache_valid 中写明 404 60s 就能开启负向缓存,但必须配合缓存区启用、忽略后端干扰头等前提,否则 Nginx 默认完全不缓存 404 响应。
必须启用 proxy_cache 并定义缓存区
负向缓存不是“开箱即用”的功能。你得先在 http 块中定义缓存区:
proxy_cache_path /var/cache/nginx/404_cache levels=1:2 keys_zone=404_cache:10m max_size=100m;
再在 location 块中显式启用它:
-
proxy_cache 404_cache;—— 没有这行,proxy_cache_valid 404完全无效
显式声明 404 缓存时长
Nginx 默认只对 2xx/3xx 状态码应用 proxy_cache_valid,404 必须单独列出:
-
proxy_cache_valid 404 60s;—— 缓存 404 响应 60 秒 - 可合并写:
proxy_cache_valid 404 503 30s; - 避免写
proxy_cache_valid any 60s;,它可能误缓存 500 类错误
处理后端响应头干扰
如果后端返回了 Cache-Control: no-cache 或 max-age=0,Nginx 会跳过缓存。此时需强制忽略:
proxy_ignore_headers Cache-Control Expires;- 也可加
Set-Cookie,防止因带 Cookie 头被自动拒缓存
注意:该指令仅在你可控后端行为或确认其缓存头不可信时使用。
增强容错与防刷效果
单靠缓存还不够稳定,建议补充两处关键配置:
-
proxy_cache_use_stale error timeout updating http_404;—— 缓存过期瞬间若后端又出错,仍可返回旧 404 -
proxy_intercept_errors on;+error_page 404 = @404_handler;—— 把大体积 HTML 错误页替换为轻量静态文件,降低缓存开销
验证方式:用 curl -I 查看 X-Cache-Status,首次为 MISS,60 秒内重复请求变为 HIT,且后端访问日志不再增长,即表示生效。











