【问题标题】:Varnish seems to be caching unwanted pagesVarnish 似乎正在缓存不需要的页面
【发布时间】:2016-09-06 22:04:52
【问题描述】:

我有一个带有页面的网站

www.mydomain.com/product-listing/

有时我们的供应商之一访问此页面时会在 URL 中设置特定参数:

www.mydomain.com/product-listing/?vendor=VENDORID

所有这些都是在特定于该供应商的页面标题中打印出一些信息。

我想要页面的任何版本,除了那些包含 vendor 参数的版本被缓存并由 varnish 提供 - 其余版本由后端提供。

然而,Varnish 似乎有时会捕捉到这些访问供应商之一并缓存该结果 - 之后将返回带有标题信息的页面。

还有一个 cookie 存在:供应商第一次访问 cookie 时将被设置,这样即使该参数不存在,也可以在返回时显示标题信息。但是:据我了解,如果后端发送 cookie,Varnish 不应该缓存?我们不会在 vcl 中操作 cookie。

我的 VCL:

sub vcl_recv {

    // I expect this to catch all urls with the parameter vendor present
    if (req.url ~ "vendor")
    {
        return (pass);
    }

    if (req.url ~ "^/product-listing"){
        return (hash);
    }

    return(pass);
}

其他子程序中没有。

【问题讨论】:

    标签: varnish varnish-vcl


    【解决方案1】:

    尚未测试此代码(Varnish 4),但您可能想尝试将其更改为以下代码,看看是否可以接受:

    if ( req.url ~ "^/\?vendor" ) {
       return (pass);
    }
    

    另外,如果这不能解决问题,您可以尝试在 vcl_backend_response 中添加以下内容:

    if (bereq.url ~ "^/product-listing" && bereq.url !~ "^/\?vendor" ) {
        unset beresp.http.set-cookie;
    }
    

    这应该告诉 varnish 取消设置响应 cookie,只要 ?vender= 不在 URL 中,通过取消设置的 cookie 缓存产品列表,但不用于 product-listing/?vender=。

    【讨论】:

    • 如果请求中存在 cookie,则添加用于传递的代码。会看看它是否在白天有效 - 否则我会尝试你的方法。谢谢! if (req.http.Cookie ~ "Vendor_Session") { return (pass); }
    猜你喜欢
    • 2020-02-24
    • 1970-01-01
    • 2016-11-26
    • 1970-01-01
    • 2015-02-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多