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

Caching 如何在Varnish上缓存对象,但告诉客户机不要缓存它,caching,varnish,no-cache,Caching,Varnish,No Cache,我正在Varnish上缓存产品详细信息页面,然后每当产品更新时,我都会从后端服务器清除缓存。我希望我的客户永远不要在他们这边缓存此页面,而是总是从Varnish请求,这样我就可以为他们提供最新的副本 目前,我有以下vcl_后端_响应配置: sub vcl_backend_response { unset beresp.http.Set-Cookie; #unset beresp.http.Cache-Control; #set beresp.http.Cache-Cont

我正在Varnish上缓存产品详细信息页面,然后每当产品更新时,我都会从后端服务器清除缓存。我希望我的客户永远不要在他们这边缓存此页面,而是总是从Varnish请求,这样我就可以为他们提供最新的副本

目前,我有以下vcl_后端_响应配置:

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

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

  • 定义Varnish在
    vcl\u后端\u响应中缓存的时间逻辑
  • 定义浏览器缓存在
    vcl\u deliver
    中缓存的时间逻辑
因此,可以指示客户端(浏览器)使用不同于Varnish的TTL进行缓存。以下内容将确保浏览器不会缓存响应:

sub-vcl\u交付{
设置resp.http.Pragma=“无缓存”;
设置resp.http.Expires=“-1”;
set resp.http.Cache-Control=“无存储,无缓存,必须重新验证,最大年龄=0”;
}
此外,如果您可以修改应用程序,您可以采用第一个解决方案中介绍的更精细的方法,即发送一个
缓存控制
标头,该标头以不同的方式定义共享缓存(Varnish)和专用缓存(browser)的缓存TTL:

Cache-Control: s-maxage=31536000, max-age=86400
上面的标题将指示浏览器缓存资源86400秒,而Varnish将缓存31536000秒。这是因为s-maxage仅适用于共享缓存。Varnish会对其进行评估,而浏览器不会


我应该在哪个子例程中添加缓存控制头?我已经测试了“应用程序发送缓存控制头”场景,它工作得非常好。谢谢@Daniel V.Daniel也可以为不同的路径设置不同的宽限期吗?如