我正在使用Varnish 3.0.5和Apache 2.4.6与PHP 5.4.21
我已阅读文档here,内容为
在默认配置中,Varnish不会缓存来自后端的对象,并且存在Set-Cookie标头。此外,如果客户端发送Cookie标头,Varnish将绕过缓存并直接转到后端。
因此,为了获得Varnish现金页面,我需要删除从客户端发送到Varnish的非重要cookie。目前,只发送了一个cookie,如下所示:
我的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(其中应该只有一个,我从上图中假设)我得到了我期望的点击量。
我希望有人能指出我可能缺少的方向吗?
感谢。
答案 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将按预期缓存。