我正在使用此行删除default.vcl
中的Cookie以允许Varnish缓存
set req.http.Cookie = regsuball(req.http.Cookie, "(^|;\s*)(__[a-z]+|__utma_a2a|has_js|Drupal.toolbar.collapsed|MNO_abc_qrst_\d+)=[^;]*", "");
但它似乎不起作用。
Varnish是负载均衡器的后面,负载均衡器设置了一个持久性cookie,在标题中以这种格式出现:
Set-Cookie:MNO_abc_qrst_80=aaaaaaaaa2a5882045525d5a4a58455e445a4a423660;expires=Fri, 12-Aug-2011 17:23:23 GMT;path=/;httponly
我在模拟器中运行此正则表达式并捕获上面的行(直到第一个“;”)。所以我认为这个正则表达式应该抓住它,但似乎不是吗?当我绕过此负载均衡器时,内容会被缓存。
有什么想法吗?我错过了什么?
答案 0 :(得分:2)
有两种方法可以去验证需要移除的整条生产线 或者删除该行的违规部分。我不知道你正在使用什么样的正则表达式引擎。为了获得更好的结果,至少需要负面看后面和后面的参考。
压缩验证:
/^(?=(Set-Cookie:\s*))(?:\1|.*?;\s*)(?:__[a-z]+|__utma_a2a|has_js|Drupal\.toolbar\.collapsed|MNO_abc_qrst_\d+)=[^;]*(?:;|$).*$/s
压缩全球部分替换:
s/(?:(?<=^Set-Cookie:)|(?<=;))\s*(?:__[a-z]+|__utma_a2a|has_js|Drupal\.toolbar\.collapsed|MNO_abc_qrst_\d+)=[^;]*(?:;|$)//g
扩展了正则表达式(在Perl中):
my $str = 'Set-Cookie: MNO_abc_qrst_80=aaaaaaaaa2a5882045525d5a4a58455e445a4a423660;expires=Fri, 12-Aug-2011 17:23:23 GMT;path=/;httponly';
## Validate part of a cookie, remove line
if ( $str =~ /
^ (?= (Set-Cookie: \s*))
(?: \1
| .*? ; \s*
)
(?: __[a-z]+
| __utma_a2a
| has_js
| Drupal\.toolbar\.collapsed
| MNO_abc_qrst_\d+
)
=
[^;]*
(?: ; | $)
.* $
/sx )
{
print "Valid, remove line '$&'\n=============\n\n";
}
## Globally, replace many parts of the cookie
if ( $str =~ s/
(?: (?<= ^ Set-Cookie:)
| (?<= ;)
)
\s*
(?: __[a-z]+
| __utma_a2a
| has_js
| Drupal\.toolbar\.collapsed
| MNO_abc_qrst_\d+
)
=
[^;]*
(?: ; | $)
//xg )
{
print "removed parts of cookie\n";
print "new string = '$str'\n";
}
输出:
Valid, remove line 'Set-Cookie: MNO_abc_qrst_80=aaaaaaaaa2a5882045525d5a4a58455e
445a4a423660;expires=Fri, 12-Aug-2011 17:23:23 GMT;path=/;httponly'
=============
removed parts of cookie
new string = 'Set-Cookie:expires=Fri, 12-Aug-2011 17:23:23 GMT;path=/;httponly'