首先,自发布此问题以来,清漆缓存中发生了很多事情。我正在回答关于 varnish-cache 6.0 及更高版本的问题:
Last-Modified
如果后端返回和/或标头,OP 期望的行为是清漆现在应该如何表现Etag
。
显然,一个对象只有在缓存中仍然存在时才能被刷新。这就是beresp.keep的用途。它延长了对象在 ttl 和宽限期过期后保存在缓存中的时间。请注意,如果缓存太小而无法保留所有对象的最大生命周期,则对象也会被 LRU 逐出。
在@maxschlepzig 的评论中,它可能是基于一个误解:
当一个对象不在缓存中但要被缓存时,varnish 不能转发客户端请求的条件标头(If-Modified-Since
, If-None-Match
),因为 304 响应不适合缓存(它没有正文并且仅与特定请求相关)。相反,对于这种情况,清漆会剥离到条件标头,以(可能)获得带有要放入缓存的对象的 200 响应。
如上所述,对于 ttl 过期后的后续后端请求,条件头是基于缓存的响应构造的。来自客户端的条件标头也不用于这种情况。
以上所有这些都适用于对象要被缓存的情况(Fetch,Hit-for-Miss(通过设置beresp.uncacheable创建))。
对于 Pass 和 Hit-for-Pass(由vcl_backend_response 中的 return(pass(duration)) 创建),客户端条件标头被传递到后端。