【问题标题】:How to cache an object on Varnish, but tell the client not the cache it如何在 Varnish 上缓存对象,但告诉客户端不要缓存它
【发布时间】:2018-12-06 02:31:58
【问题描述】:

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

【问题讨论】:

    标签: caching varnish no-cache


    【解决方案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 标头,该标头定义共享缓存(Varnish)和私有缓存的缓存 TTL (浏览器)不同:

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

    上面的标头将指示浏览器缓存资源 86400 秒,而 Varnish 将缓存 31536000 秒。这是因为 s-maxage 仅适用于共享缓存。 Varnish 会评估它,而浏览器不会。

    【讨论】:

    • 我已经测试了“应用程序发送 Cache-Control 标头”的场景,它运行良好。谢谢@Daniel V.
    • Daniel 是否也可以为不同的路径设置不同的宽限期?如stackoverflow.com/q/53933978/3560465
    【解决方案2】:

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

    【讨论】:

    • 我应该在哪个子程序中添加缓存控制标头?
    猜你喜欢
    • 2012-03-09
    • 2014-05-01
    • 1970-01-01
    • 2020-01-27
    • 2012-08-20
    • 1970-01-01
    • 2021-04-26
    • 1970-01-01
    • 2011-03-23
    相关资源
    最近更新 更多