清漆:删除一些饼干问题

时间:2014-03-20 23:22:03

标签: regex cookies varnish

我正在使用Varnish 3.0.5和Apache 2.4.6与PHP 5.4.21

我已阅读文档here,内容为

  

在默认配置中,Varnish不会缓存来自后端的对象,并且存在Set-Cookie标头。此外,如果客户端发送Cookie标头,Varnish将绕过缓存并直接转到后端。

因此,为了获得Varnish现金页面,我需要删除从客户端发送到Varnish的非重要cookie。目前,只发送了一个cookie,如下所示:enter image description here

我的default.vcl文件有以下代码,它应该删除名称以下划线字符开头或名称为“has_js”的cookie:

 sub vcl_recv {
 #       //Remove all cookies that begin with an underscore
    set req.http.Cookie = regsuball(req.http.Cookie, "(^|;\s*)(_[_\.a-z0-9]+|has_js)=[^;]*", "");
 #       //Remove a ";" prefix, if present.
    set req.http.Cookie = regsub(req.http.Cookie, "^;\s", "");

 #       unset req.http.Cookie;
 ...

我已经测试了此application的正则表达式,并且它找到了从客户端发送的Cookie的匹配项,如上图所示。

当我跑步时

 ]# varnishes

从命令行,我发现我没有“命中”只是“未命中”。但是,如果我取消注释

 unset req.http.Cookie;

行,以便它删除所有Cookie(其中应该只有一个,我从上图中假设)我得到了我期望的点击量。

我希望有人能指出我可能缺少的方向吗?

感谢。

1 个答案:

答案 0 :(得分:0)

上面代码的问题是default.vcl中的这一行,稍后会调用它:

 if (req.http.Authorization || req.http.Cookie) {
 #         /* Not cacheable by default */
           return (pass);
 }

它被注释掉了,但仍然被调用作为Varnish默认行为的一部分。 如您所见,它询问是否

 req.http.Cookie

存在。在问题中提供的代码中,变量仍然存在,但是将是一个空字符串。此空字符串仍将以默认的Varnish行为传递逻辑测试。因此,必须在删除不需要的cookie的代码之后添加以下代码:

 set req.http.Cookie = regsuball(req.http.Cookie, "(^|;\s*)(_[_\.a-z0-9]+|has_js)=[^;]*", "");
 #       //Remove a ";" prefix, if present.
 set req.http.Cookie = regsub(req.http.Cookie, "^;\s", "");

 if (req.http.Cookie == "") {
         unset req.http.Cookie;
 }

现在,如果req.http.Cookie为空,则该对象将被删除,Varnish将按预期缓存。