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

fko*_*sal 5 caching no-cache 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;
    }
}
Run Code Online (Sandbox Code Playgroud)

但是,使用此配置,客户端将响应缓存 1 小时,并且不再询问,即使缓存已在 Varnish 上清除。

如果我取消注释缓存控制相关的行,这次 Varnish 不会缓存页面并且总是从后端服务器请求一个新的副本。

这可以在 Varnish v6.0 中实现吗?

Dan*_*nin 3

是的,有可能:

\n\n
    \n
  • 定义Varnishvcl_backend_response.
  • \n
  • 定义浏览器缓存将内容缓存多长时间的逻辑vcl_deliver
  • \n
\n\n

因此,可以指示客户端(浏览器)使用与 Varnish 不同的 TTL 进行缓存。以下内容将确保浏览器不会缓存响应:

\n\n
sub vcl_deliver {\n    set resp.http.Pragma = "no-cache";\n    set resp.http.Expires = "-1";\n    set resp.http.Cache-Control = "no-store, no-cache, must-revalidate, max-age=0";\n}\n
Run Code Online (Sandbox Code Playgroud)\n\n

此外,如果您可以修改您的应用程序,您可以采用第一个解决方案中概述的更精细的方法,即发送一个Cache-Control标头,该标头以不同的方式定义共享缓存(Varnish)和私有缓存(浏览器)的缓存 TTL:

\n\n
Cache-Control: s-maxage=31536000, max-age=86400\n
Run Code Online (Sandbox Code Playgroud)\n\n
\n

上面的标头将指示浏览器缓存资源 86400 秒,而 Varnish 将缓存 31536000 秒。这是因为 s-maxage 仅适用于共享缓存。Varnish 会对其进行评估,而浏览器则不会\xe2\x80\x99t。

\n
\n