需显式配置proxy_cache_valid 301/302等状态码及时间,且上游响应须含Cache-Control或Expires头,否则需proxy_ignore_headers配合expires强制缓存,同时启用proxy_cache并验证X-Cache-Status为HIT。

要为重定向响应(如 301、302)单独设置 proxy_cache_valid 缓存时长,需在 Nginx 的 location 或 server 块中,**显式指定 HTTP 状态码 + 时间**,不能依赖通配规则覆盖。
明确匹配重定向状态码
Nginx 的 proxy_cache_valid 支持按状态码精确配置。重定向响应必须用数字形式列出,例如:
-
proxy_cache_valid 301 302 10m;—— 将 301 和 302 响应统一缓存 10 分钟 -
proxy_cache_valid 301 1h; proxy_cache_valid 302 5m;—— 分别设置不同缓存时长(注意:后定义的会覆盖同状态码的前一条,但不同状态码互不干扰)
确保缓存机制实际生效
仅配置 proxy_cache_valid 不够,还需满足以下前提:
- 上游服务器返回的重定向响应中,必须包含可缓存的响应头,如
Cache-Control: public, max-age=3600或Expires;否则 Nginx 默认不缓存 3xx 响应(即使写了proxy_cache_valid) - 若上游无合适缓存头,可通过
proxy_ignore_headers忽略其限制,再配合expires或add_header强制注入,例如:proxy_ignore_headers Cache-Control Expires;expires 10m; - 确认已启用缓存区:
proxy_cache my_cache;,且my_cache已通过proxy_cache_path正确定义
验证是否命中缓存
调试时建议开启响应头标识,便于确认缓存行为:
- 添加
add_header X-Cache-Status $upstream_cache_status; - 访问触发重定向的 URL,观察响应头中
X-Cache-Status是否为HIT(首次为MIS,第二次起应为HIT) - 注意:部分浏览器对 301 有强本地缓存行为,测试时建议用
curl -I绕过浏览器影响
常见误区提醒
容易忽略的关键点:
-
proxy_cache_valid 200 301 302 1h;这种写法虽合法,但若上游返回 302 且带Cache-Control: no-store,Nginx 仍不会缓存——必须配合proxy_ignore_headers -
proxy_cache_valid对 304 响应无效,它只控制 2xx/3xx/4xx 的缓存时长,304 由条件请求机制处理 - 重定向目标 URL(即
Location头里的地址)不会被自动缓存,proxy_cache只缓存当前请求的响应体和头,不递归缓存跳转链











