应为404响应显式配置独立短缓存,如proxy_cache_valid 404 5s,并配合proxy_cache、proxy_ignore_headers等指令确保缓存生效,以防御恶意扫描而非优化体验。

直接为 404 响应设置独立、极短的缓存周期,核心是让 Nginx 主动缓存后端返回的 404,而非默认跳过。这不是为了提升用户体验,而是防止恶意扫描、爬虫探测或瞬时雪崩打穿后端。
明确写死 404 状态码与时间
Nginx 默认只对 200/301/302 缓存,404 必须显式声明才生效。不能依赖泛用规则(如 proxy_cache_valid any 1s),必须单独指定:
-
proxy_cache_valid 404 5s;—— 最常用,兼顾防刷效果与响应新鲜度 - 可合并多个错误码:
proxy_cache_valid 404 503 10s; - 避免设为 0s:Nginx 会忽略;也慎用 1s,实际处理有毫秒级延迟,几乎无意义
确保缓存能真正落地
仅写 proxy_cache_valid 404 5s 不够,还需满足以下任一条件:
- 后端响应头中包含可缓存标识,例如
Cache-Control: public, max-age=5 - 或在 location 中加:
proxy_ignore_headers Cache-Control Expires;—— 强制忽略上游禁用缓存的头,完全按你定义的 5 秒执行 - 同时确认已启用缓存区:
proxy_cache your_cache_zone;(必须提前在 http 块定义proxy_cache_path)
搭配 inactive 清理与 stale 容错
大量随机 404 路径(如 /wp-admin.php、/phpmyadmin/)会快速堆积缓存,需双层控制:
- 在
proxy_cache_path中设inactive=30s:任何 404 缓存项若 30 秒内未被再次访问,自动清理 - 加
proxy_cache_use_stale error timeout updating http_404;:缓存过期瞬间若后端又出错,仍可返回旧 404,避免请求穿透 - 建议开启
proxy_cache_lock on;:同一 URL 的首次 404 请求锁住后续并发,只让一个请求回源,其余等结果并共享缓存
验证是否生效
用 curl 检查响应头即可确认:
- 首次请求不存在路径:
curl -I https://yoursite.com/xxx→ 看到HTTP/1.1 404 Not Found和X-Cache-Status: MISS - 5 秒内再请求相同路径 → 应返回
404且X-Cache-Status: HIT,同时后端日志无新增记录 - 若始终是 MISS,检查是否漏了
proxy_cache启用,或后端返回了Set-Cookie或Cache-Control: no-store(需加proxy_ignore_headers一并忽略)


















