301必须设长缓存(如7d),因其语义为永久重定向,设极短周期会破坏SEO权重传递、增加后端与CDN压力;302才可设极短缓存(如30s),且两者必须分开配置,严禁合并或依赖any规则。

不建议为 301 设置极短缓存——这违背 HTTP 语义,会破坏 SEO 权重传递、增加后端压力、导致浏览器和 CDN 无法建立稳定信任。
但如果你确实需要仅对 302 设置极短缓存(例如 30 秒或 1 分钟),同时确保 301 仍按规范长期缓存(如 7d),可以这样配置:
必须分开写,不能合并,不能依赖 any
location ~ \.php$ {
fastcgi_pass php_backend;
fastcgi_cache phpcache;
# ✅ 正确:301 按语义设长(推荐 7d)
fastcgi_cache_valid 301 7d;
# ✅ 正确:302 设极短(如 30s 或 1m)
fastcgi_cache_valid 302 30s;
# 其他状态码可单独设定
fastcgi_cache_valid 200 10m;
fastcgi_cache_valid 404 1m;
}常见错误写法(会导致 301 缓存失效或被覆盖):
-
fastcgi_cache_valid 301 302 30s;→ 301 被强制设为 30 秒,严重错误 -
fastcgi_cache_valid any 1m;→ 301 会被这条兜底规则覆盖,失去语义保障 - 只写
fastcgi_cache_valid 302 30s;却漏掉301行 → 301 可能不缓存或走默认(通常为 0)
额外关键点:
- 若 PHP 后端返回的 302 带
Cache-Control: no-cache,需加:fastcgi_ignore_headers Cache-Control; - 确保
fastcgi_cache_key包含$request_uri(含参数),否则不同查询串的 302 可能互相污染缓存 - 验证是否生效:添加
add_header X-Cache $upstream_cache_status;,用curl -I观察是否出现HIT
301 不适合极短缓存。若业务真需“快速变更跳转”,应改用 302,并配极短缓存;301 请始终视为长期承诺。

















