清漆:VCL~具有req值

时间:2014-02-06 17:16:22

标签: syntax varnish vcl

我想避免在同一页面上缓存,具体取决于cookie值(我的用户的个人资料中包含/ firstname-lastname这样的网址,并且可以访问其他用户的个人资料)。

在我的cookie中,我存储了“firstname-lastname”值,并尝试对其进行测试。 所以我做了这个:

set req.http.X-SLUG = regsub(req.http.cookie, ".*user_slug=([^;]+);.*", "\1");
if (req.url ~ "^/" + req.http.X-SLUG) {

这里是编译错误:

Expected ')' got '+' (program line 73), at ('conf.vcl' Line 50 Pos 28)
         if (req.url ~ "^/" + req.http.X-SLUG) {
 ---------------------------#-------------------

你知道怎么做吗?

由于

1 个答案:

答案 0 :(得分:0)

在varnish中,所有正则表达式都是在首次加载配置时编译的,因此必须是静态字符串。

解决此限制的一种方法是使用regsub调用来提取您感兴趣的URL部分,然后测试相等性:

set req.http.X-SLUG = regsub(req.http.cookie, ".*user_slug=([^;]+).*", "\1");
set req.http.X-TMP-URL = regsub(req.url, "^/(.*)$", "\1");
if (req.http.X-SLUG == req.http.X-TMP-URL) {
    ....
}
remove req.http.X-TMP-URL;

注意,在上面的示例中,我从X-SLUG正则表达式中删除了;。即使user_slug是列表中的最后一个cookie,这也允许正则表达式工作。