需在能捕获重定向响应的location或server块中,用proxy_cache_valid按状态码(如301、302)单独设置缓存时长,并确保后端响应含可缓存头或配合proxy_ignore_headers忽略禁止缓存头。

要为重定向静态页(如 301/302 响应)单独设置 proxy_cache_valid 缓存时长,关键在于:**用状态码精确匹配响应类型,并确保该指令作用于能捕获重定向响应的 location 或 server 块中**。Nginx 默认不缓存重定向响应,需显式启用并配置。
确认重定向响应可被缓存
Nginx 默认跳过缓存 301/302 响应,必须配合以下指令才能生效:
- proxy_cache_use_stale updating 不影响缓存逻辑,但非必需;真正需要的是 proxy_buffering on(默认开启)和明确的状态码声明
- 确保后端返回的重定向响应中包含可缓存的头部,例如:
Cache-Control: public, max-age=3600或至少无Cache-Control: no-store等禁止缓存字段 - 若后端未设 Cache-Control,Nginx 仅依赖
proxy_cache_valid的状态码规则——这是实现“独立缓存时长”的核心手段
在 proxy_pass 上下文中配置状态码专属缓存规则
将 proxy_cache_valid 放在能触达重定向响应的 location 块内(通常是反向代理 location),并直接指定状态码:
location /static-redirects/ {
proxy_pass https://backend;
proxy_cache my_cache;
proxy_cache_valid 301 1h; # 301 重定向缓存 1 小时
proxy_cache_valid 302 10m; # 302 重定向缓存 10 分钟
proxy_cache_valid 200 304 1d; # 其他正常响应保持原有策略
}
注意:多个 proxy_cache_valid 行可共存,Nginx 按状态码精确匹配,优先级高于泛用规则(如只写 proxy_cache_valid 10m)。
验证缓存是否命中重定向响应
通过响应头确认 Nginx 是否真的缓存了重定向:
- 首次请求重定向路径,观察响应头中是否有
X-Cache: MISS和Location字段 - 再次请求同一路径,若返回
X-Cache: HIT且Location相同、无后端访问日志,则说明重定向已被缓存 - 检查
Age头是否递增,或用curl -I对比两次响应时间与头部一致性
常见陷阱与绕过方案
以下情况会导致 proxy_cache_valid 301/302 不生效:
- location 匹配不到重定向请求:例如重定向目标是外部 URL 或新路径,而你的 proxy_cache_valid 只写在原始请求的 location 中——需确保该 location 覆盖发起重定向的入口路径
-
后端返回了不可缓存头:如
Cache-Control: private, max-age=0或Set-Cookie,会覆盖proxy_cache_valid。此时可加 proxy_ignore_headers Cache-Control Expires Set-Cookie 强制忽略 - proxy_cache_valid 位置错误:写在 http 块顶层无效,必须在 server 或 location 内,且该块实际执行了 proxy_pass











