在 nginx 中,可以通过 proxy_cache_valid 指令针对不同 http 状态码设置独立的缓存过期时间。只需在 location 块中配置该指令,指定状态码及其对应的时长(如 200 302 10m),nginx 就会根据响应状态自动应用相应的缓存策略。

如何为成功响应和重定向设置不同的缓存时长
对于常见的 200 OK 和 302 Found 状态码,可以分别赋予不同的缓存有效期。例如,将成功的页面内容缓存 10 分钟,而将临时重定向仅缓存 1 分钟,这样既能保证静态资源的高效访问,又能确保重定向链接的及时性。

server {
listen 80;
server_name example.com;
proxy_cache_path /var/cache/nginx levels=1:2 keys_zone=my_cache:10m max_size=1g inactive=60m use_temp_path=off;
location / {
proxy_pass http://backend;
proxy_cache my_cache;
# 针对 200 和 302 状态码设置不同缓存时间
proxy_cache_valid 200 302 10m;
proxy_cache_valid 404 1m;
add_header X-Cache-Status $upstream_cache_status;
}
}
上述配置中,proxy_cache_valid 指令允许在同一行指定多个状态码共享同一个缓存时间。如果希望更精细地控制,可以为每个状态码单独写一行。当后端返回 200 时,Nginx 会将响应体存入缓存目录,并在接下来的 10 分钟内直接返回缓存副本,不再向后端发起请求。
如何处理错误页面的缓存策略
除了正常响应,错误页面如 404 Not Found 或 500 Internal Server Error 也适合进行缓存,以避免对后端造成重复压力。通常建议为错误页面设置较短的缓存时间,以便在后端修复问题后能快速恢复。

# 在 location 块中添加以下配置 proxy_cache_valid 404 1m; proxy_cache_valid 500 5m;
通过设置 proxy_cache_valid 404 1m,Nginx 会缓存 404 响应 1 分钟。在这 1 分钟内,如果有相同的请求到达,Nginx 会直接返回之前缓存的错误页面,而不会转发给后端服务器。这有助于减轻后端在处理不存在资源时的负载。同时,使用 $upstream_cache_status 变量可以在响应头中查看缓存命中状态,便于调试和监控。
基于 proxy_cache_valid 指令中状态码与时间的对应关系的具体问题
当在 proxy_cache_valid 指令中同时指定了多个状态码时,Nginx 是如何确定最终缓存时间的?具体而言,如果配置了 proxy_cache_valid 200 10m; proxy_cache_valid 200 5m;,Nginx 会以哪个时间为准?
Nginx 处理 proxy_cache_valid 指令时,是按照配置文件的顺序从上到下匹配的。如果同一个状态码出现在多行配置中,Nginx 会使用**最后出现**的那条规则。因此,在上述例子中,200 状态的缓存时间将是 5 分钟,而不是 10 分钟。这种设计允许管理员通过调整配置顺序来覆盖之前的设置,但为了避免混淆,建议每个状态码只在一个地方定义,或者使用同一行指定多个状态码共享一个时间。











