我有一个网页
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);
}
其他子程序中没有任何内容。
答案 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 =。