如何检查清漆中的cookie的价值

我有一个语言的cookie。 我想检查这个cookie是否设置,并检查其值,redirect到特定的页面的用户。 cookie名称是Lang ,其值可能是En,Fr或Ar

如果(req.http.Cookie〜“Lang”){
 //现在我想检查cookie的值
 //如果LANG ==“Ar”
 //设置req.url = req.url“CookieValue”
 }

任何人都知道如何检查清漆中的cookie值?
谢谢

由于所有的cookie(包括名称和值)都在req.http.Cookiestring中,因此您应该能够同时检查名称和值。 不幸的是,Varnish没有任何处理cookies的专门方法 – 你必须使用正则expression式。

需要注意的是,cookie由分号和空格分隔,例如:

 cookie1=abc; cookie2=def 

我们知道,因此,我们的cookie不是在req.http.Cookie的开头,就是以分号和空格开头,并且以分号结尾,或者在req.http.Cookie的末尾。 鉴于此,我们可以构造一个匹配我们的cookie和分号(如果有的话)的正则expression式。 就像是:

 (^|;\s*)(Lang=En)(;|$) 

简而言之,通过以上我们有:

  • 第一组括号 – 匹配开始:
    • ^表示string的开始
    • | 意味着或
    • ; 是从字面上(即分号)
    • \s意味着空白
    • *表示前面的字符的一个或多个重复
    • 摘要:string的开头或分号后面跟着空格
  • 第二组括号 – 匹配cookie:
    • Lang是cookie的名字
    • En是cookie的价值
  • 第三组括号 – 匹配结束
    • ; 是从字面上(即分号)
    • | 意味着或
    • $表示string的结尾
    • 摘要:分号或string的结尾

使用上述,我们可以检查cookie并对其执行一些操作:

 if (req.http.Cookie ~ "(^|;\s*)(Lang=En)(;|$)"){ //do something with En } elseif (req.http.Cookie ~ "(^|;\s*)(Lang=Fr)(;|$)") { //do something with Fr; } 

可能有更好的方法,或更有效的正则expression式(不幸的是,清漆没有用户定义的variables – 这意味着你不能使用正则expression式捕获组),但希望这会做的工作。

可以说,你可以使用regsub构build一个捕获组的正则expression式,并将其设置为子域,可能类似于:

 set req.url = regsub(req.http.Cookie, "(?:^|;\s*)(?:Lang=(.*?))(?:;|$)", "\1.")+"example.com"; 

在“Lang = en”的情况下,您可以捕获“en”添加一个句点(。),并将其前置到“example.com”,并为您指定en.example.com。 我build议,虽然直接使用cookie来设置url – 没有太多的错误检查 – 将是一个非常糟糕的解决scheme。 如果你只有3种语言,那么if语句和默认语句会更加安全。

注意:以上是未经testing的,正则expression式不是我的专长 – 期待一些错误 – 但希望前提正常。