如何设置短周期缓存策略,针对404错误页面使用proxy_cache_valid?

2026-05-02 22:373阅读0评论SEO资源
  • 内容介绍
  • 文章标签
  • 相关推荐

本文共计673个文字,预计阅读时间需要3分钟。

如何设置短周期缓存策略,针对404错误页面使用proxy_cache_valid?

直接在 `proxy_cache_valid 指令中设置404状态码为单独的缓存时间,可以设置较短的缓存时间,从而防止恶意扫描或高频无效请求对后端的冲击。关键在于:

明确指定 404 的缓存有效期

在 location 块中启用缓存时,添加一行专用于 404 的规则:

proxy_cache_valid 404 1m;

这表示:只要后端返回了 404,Nginx 就会把整个 404 响应(含状态码和响应体)缓存 1 分钟。期间所有访问相同 URL 的请求,Nginx 直接从缓存返回,不再转发给后端。

常见组合写法示例:

  • proxy_cache_valid 200 302 10m; —— 正常响应缓存 10 分钟
  • proxy_cache_valid 404 30s; —— 404 响应只缓存 30 秒(更激进防刷)
  • proxy_cache_valid any 1m; —— 其他所有状态码统一缓存 1 分钟(慎用,可能误缓存 5xx)

确保 404 响应可被缓存

Nginx 默认不会缓存 404 响应,必须满足两个前提:

  • 后端实际返回的是标准 HTTP 404 状态码(不是 200 + 自定义文案)
  • 后端响应头中未携带禁止缓存的指令,例如:
    Cache-Control: no-storePragma: no-cache

若后端无法控制响应头,可在 Nginx 中强制忽略:

proxy_ignore_headers Cache-Control Expires;

配合 proxy_intercept_errors 实现闭环

如果后端返回 404 时还附带了较大体积的错误页(比如 HTML),建议同时开启错误拦截,避免把大页面也缓存下来:

  • 启用:proxy_intercept_errors on;
  • 定义:error_page 404 = /custom_404.html;(注意等号,表示内部重写,不改变状态码)
  • 再为该自定义页配置极简响应(如纯文本或小图),并设置 proxy_cache_valid 404 1m;

这样既保持对外返回 404 状态码,又大幅降低缓存体积和传输开销。

验证与观察

配置生效后,可通过以下方式确认是否起作用:

  • curl -I http://your-domain.com/xxx 查看响应头,首次应有 X-Cache: MISS,再次访问应变为 X-Cache: HIT
  • 检查 Nginx error log,确认无大量 upstream timeout 或 connection refused 日志(说明请求未打到后端)
  • 使用 nginx -t && systemctl reload nginx 重载,避免全量重启
标签:Proxy

本文共计673个文字,预计阅读时间需要3分钟。

如何设置短周期缓存策略,针对404错误页面使用proxy_cache_valid?

直接在 `proxy_cache_valid 指令中设置404状态码为单独的缓存时间,可以设置较短的缓存时间,从而防止恶意扫描或高频无效请求对后端的冲击。关键在于:

明确指定 404 的缓存有效期

在 location 块中启用缓存时,添加一行专用于 404 的规则:

proxy_cache_valid 404 1m;

这表示:只要后端返回了 404,Nginx 就会把整个 404 响应(含状态码和响应体)缓存 1 分钟。期间所有访问相同 URL 的请求,Nginx 直接从缓存返回,不再转发给后端。

常见组合写法示例:

  • proxy_cache_valid 200 302 10m; —— 正常响应缓存 10 分钟
  • proxy_cache_valid 404 30s; —— 404 响应只缓存 30 秒(更激进防刷)
  • proxy_cache_valid any 1m; —— 其他所有状态码统一缓存 1 分钟(慎用,可能误缓存 5xx)

确保 404 响应可被缓存

Nginx 默认不会缓存 404 响应,必须满足两个前提:

  • 后端实际返回的是标准 HTTP 404 状态码(不是 200 + 自定义文案)
  • 后端响应头中未携带禁止缓存的指令,例如:
    Cache-Control: no-storePragma: no-cache

若后端无法控制响应头,可在 Nginx 中强制忽略:

proxy_ignore_headers Cache-Control Expires;

配合 proxy_intercept_errors 实现闭环

如果后端返回 404 时还附带了较大体积的错误页(比如 HTML),建议同时开启错误拦截,避免把大页面也缓存下来:

  • 启用:proxy_intercept_errors on;
  • 定义:error_page 404 = /custom_404.html;(注意等号,表示内部重写,不改变状态码)
  • 再为该自定义页配置极简响应(如纯文本或小图),并设置 proxy_cache_valid 404 1m;

这样既保持对外返回 404 状态码,又大幅降低缓存体积和传输开销。

验证与观察

配置生效后,可通过以下方式确认是否起作用:

  • curl -I http://your-domain.com/xxx 查看响应头,首次应有 X-Cache: MISS,再次访问应变为 X-Cache: HIT
  • 检查 Nginx error log,确认无大量 upstream timeout 或 connection refused 日志(说明请求未打到后端)
  • 使用 nginx -t && systemctl reload nginx 重载,避免全量重启
标签:Proxy