直接在 location 块中配置 proxy_cache_valid 可按状态码设置独立缓存时长,但必须配套 proxy_cache_path 定义缓存区、proxy_cache 调用该区,且上游响应需可缓存;支持合并写法(如 200 302 10m)或分开写法(如 301 7d;302 2m),后写同状态码规则会覆盖前写。

直接在 location 块里写 proxy_cache_valid,就能为该路径下的响应按状态码设缓存时长。它会覆盖 http 块里的全局设置,但只作用于当前 location 匹配的请求。
location 内必须配套启用缓存区
单独写 proxy_cache_valid 没有效果,以下三项缺一不可:
- 在 http 块中用
proxy_cache_path定义缓存区,例如:proxy_cache_path /var/cache/nginx levels=1:2 keys_zone=my_cache:10m max_size=1g; - 在当前 location 中显式调用该区:
proxy_cache my_cache; - 确保上游响应本身可被缓存——不能含
Cache-Control: no-cache、private或Set-Cookie(除非用proxy_ignore_headers Set-Cookie忽略)
按状态码分别设置缓存时间
不同 HTTP 状态码可以独立控制,写法灵活:
- 合并写法(相同缓存时长):
proxy_cache_valid 200 302 10m;→ 200 和 302 都缓存 10 分钟 - 分开写法(不同缓存时长):
proxy_cache_valid 200 5m;<br>proxy_cache_valid 301 7d;<br>proxy_cache_valid 500 30s;
- 注意:后写的同状态码规则会覆盖前面的,但不同状态码互不影响
重定向响应(301/302)需额外留意
3xx 响应默认不易缓存,尤其当上游返回 Cache-Control: no-store 时:
- 必须显式配置
proxy_cache_valid 301 1h;这类指令 - 若上游没发合适的缓存头,要加
proxy_ignore_headers Cache-Control Expires;,再用expires 1h;或add_header Cache-Control "public, max-age=3600";强制注入 - 验证是否生效:加
add_header X-Cache-Status $upstream_cache_status;,用curl -I查看第二次是否返回HIT
路径级差异化策略示例
比如对 API 和静态资源走不同策略:
- API 接口(/api/)强调时效性:
location /api/ {<br> proxy_pass http://backend;<br> proxy_cache my_cache;<br> proxy_cache_valid 200 30s;<br> proxy_cache_valid 500 502 10s;<br>} - 旧链接跳转(/old/)倾向长期稳定:
location /old/ {<br> proxy_pass http://backend;<br> proxy_cache my_cache;<br> proxy_cache_valid 301 30d;<br> proxy_cache_valid 302 2m;<br>}











