我在Varnish上缓存产品详细信息页面,然后每当产品更新时,我都会从后端服务器清除缓存。我希望我的客户永远不要在他们这边缓存此页面,而总是向Varnish询问,以便为他们提供最新的副本。
当前,我具有以下vcl_backend_response的配置:
sub vcl_backend_response {
unset beresp.http.Set-Cookie;
#unset beresp.http.Cache-Control;
#set beresp.http.Cache-Control = "no-cache";
if (bereq.url ~ "^/products/\d+/details") {
set beresp.ttl = 1h;
}
}
但是,使用此配置,客户端会将响应缓存1小时,并且不会再次询问,即使缓存已在Varnish上清除。
如果我取消注释与缓存控制相关的行,那么这次Varnish不会缓存页面,而是始终从后端服务器请求新副本。
这在Varnish v6.0中可以实现吗?
答案 0 :(得分:1)
是的,有可能:
vcl_backend_response
内部由Varnish 缓存内容多长时间的逻辑。vcl_deliver
内浏览器缓存 缓存内容的逻辑。因此,可以指示客户端(浏览器)使用与Varnish不同的TTL进行缓存。以下内容将确保浏览器不会缓存响应:
sub vcl_deliver {
set resp.http.Pragma = "no-cache";
set resp.http.Expires = "-1";
set resp.http.Cache-Control = "no-store, no-cache, must-revalidate, max-age=0";
}
此外,如果您可以修改应用,则可以采用第一种解决方案here中概述的更精细的方法,即发送单个Cache-Control
标头,该标头定义共享缓存的缓存TTL(Varnish )和专用缓存(浏览器)不同:
Cache-Control: s-maxage=31536000, max-age=86400
上面的标头将指示浏览器将资源缓存86400秒,而Varnish将缓存31536000。这是因为s-maxage仅适用于共享缓存。 Varnish会评估它,而浏览器则不会。
答案 1 :(得分:0)
尝试添加标题 缓存控制:无缓存,必须重新验证