proxy_cache_revalidate 是 Nginx 在缓存过期后发起条件请求(If-Modified-Since/If-None-Match)校验资源是否变更的机制,通过 304 响应续期缓存、避免重复传输,需配合 proxy_cache、proxy_cache_valid 及后端正确返回 Last-Modified 或 ETag 才生效。

proxy_cache_revalidate 是 Nginx 用于在缓存过期后、向后端发起“条件请求”(Conditional Request)以校验资源是否变更的机制,它不直接更新缓存,而是通过 304 Not Modified 响应避免重复传输完整响应体,从而提升效率并保证缓存新鲜度。
核心原理:用 If-Modified-Since / If-None-Match 发起校验
当缓存条目过期(或配置了 proxy_cache_valid 的短有效期),且启用了 proxy_cache_revalidate on,Nginx 在收到新请求时不会立即回源拉取完整响应,而是构造一个带条件头的请求发往后端:
- 若原始响应含
Last-Modified,Nginx 自动添加If-Modified-Since头,值为该时间戳 - 若原始响应含
ETag,Nginx 自动添加If-None-Match头,值为该 ETag - 后端根据这两个头判断资源未变,返回
304 Not Modified(不含响应体),Nginx 将原缓存内容续期并返回给客户端 - 若后端返回
200 OK(含新内容),Nginx 更新缓存并返回新响应
必须配合的配置项
单独开启 proxy_cache_revalidate 并不能生效,需确保以下基础配置就位:
-
proxy_cache已定义并启用(如proxy_cache my_cache) -
proxy_cache_valid设置了合理的过期时间(例如proxy_cache_valid 200 302 10m) - 后端服务正确返回
Last-Modified或ETag(Nginx 默认信任并缓存这些头) - 建议开启
proxy_cache_lock,防止并发请求触发多次回源校验
实际效果与限制
该机制本质是“被动刷新”,只在缓存过期后首次请求触发校验,不是定时轮询或主动推送:
- 对静态资源(如 JS/CSS/图片)很实用,尤其搭配后端正确生成 ETag 或 Last-Modified 时
- 不适用于动态内容频繁变更但无合理缓存头的场景(此时后端需补全响应头)
- Nginx 不会修改原始响应头中的
Cache-Control或Expires,续期后的缓存有效期仍按proxy_cache_valid规则计算 - 若后端忽略条件头直接返回
200,Nginx 仍会更新缓存——这属于后端逻辑问题,非 Nginx 行为异常
验证是否生效的小技巧
可通过日志和响应头观察行为:
- 开启
log_format记录$upstream_http_last_modified和$upstream_http_etag,确认缓存中存了哪些校验信息 - 用
curl -I查看响应是否含X-Cache: HIT或X-Cache: EXPIRED(需自定义日志变量) - 抓包或查看 Nginx error log 中
upstream sent no valid response类提示,可辅助定位后端未正确处理条件请求的问题


















