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

我正在缓存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中是否可以实现?

最佳答案 是的,这是可能的:

>定义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标头,以不同方式为共享缓存(Varnish)和私有缓存(浏览器)定义缓存TTL:

Cache-Control: s-maxage=31536000, max-age=86400

The header above will instruct a browser to cache resource for 86400 seconds, while Varnish will cache for 31536000. This is because s-maxage only applies to shared caches. Varnish evaluates it, while browsers don’t.

点赞