proxy_cache_revalidate 是 Nginx 在缓存过期后自动发起条件请求(带 If-Modified-Since/If-None-Match)以验证缓存有效性的指令;收到 304 则复用并更新缓存,否则刷新为新内容,需上游支持 ETag/Last-Modified。

Nginx 的 proxy_cache_revalidate 指令用于在缓存条目过期后,自动向上游服务器发起条件请求(Conditional Request),以判断缓存是否仍有效,避免不必要的全量响应传输。
什么是 proxy_cache_revalidate?
该指令启用后,当缓存对象过期(但尚未被清除),Nginx 在转发请求给上游前,会自动添加 If-Modified-Since 和/或 If-None-Match 请求头,并等待上游返回 304 Not Modified 或完整响应。若收到 304,Nginx 复用本地缓存并更新其过期时间;否则,缓存被刷新为新内容。
它依赖于上游服务器正确支持条件请求和返回相应响应头(如 Last-Modified 或 ETag)。
如何启用并配置条件重验证
需在 http、server 或 location 块中开启,并配合其他缓存相关指令使用:
- 设置
proxy_cache_revalidate on; - 确保已定义缓存区域:
proxy_cache my_cache; - 配置缓存有效期(如
proxy_cache_valid 200 302 10m;) - 建议开启
proxy_cache_lock on;,防止并发请求触发多次上游验证 - 可选:用
proxy_cache_lock_timeout控制锁等待时长
实际效果与注意事项
启用后,Nginx 日志中可见类似 "GET /api/data HTTP/1.1" 304 的记录,表示成功复用缓存;若上游不支持 304(如始终返回 200),则每次都会回源并覆盖缓存,失去优化意义。
注意点:
- 仅对已缓存且过期的对象生效;新鲜缓存直接返回,不触发重验证
- 不改变客户端请求头,条件头由 Nginx 自动注入,客户端无感知
- 若上游返回 304 但缺少
Cache-Control或Expires,Nginx 默认沿用原缓存的过期策略 - 与
proxy_cache_background_update配合,可在返回旧缓存的同时异步刷新,提升用户体验
简单示例配置
proxy_cache_path /var/cache/nginx levels=1:2 keys_zone=my_cache:10m max_size=1g;
upstream backend { server 127.0.0.1:8000; }
server {
location / {
proxy_pass http://backend;
proxy_cache my_cache;
proxy_cache_valid 200 302 5m;
proxy_cache_revalidate on;
proxy_cache_lock on;
}
}

















