Varnish似乎在缓存不需要的页面

时间:2016-05-11 13:11:43

标签: varnish varnish-vcl

我有一个网页

  

www.mydomain.com/product-listing /

有时,我们的某个供应商会访问此页面,并在网址中设置特定参数:

  

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

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

除了包含供应商参数的那些版本之外,我希望页面的任何版本都被缓存 - 由后端提供服务 - 其余部分由后端提供。

然而,似乎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);
}

其他子程序中没有任何内容。

1 个答案:

答案 0 :(得分:1)

Haven未对此代码进行测试(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设置缓存产品列表,而不是产品列表/?vender =。