如何在Varnish上缓存对象,但告诉客户端不要缓存它

时间:2018-12-06 02:31:58

标签: caching varnish no-cache

我在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中可以实现吗?

2 个答案:

答案 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)

尝试添加标题 缓存控制:无缓存,必须重新验证