我有一个语言的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意味着空白 *表示前面的字符的一个或多个重复 Lang是cookie的名字 En是cookie的价值 ; 是从字面上(即分号) | 意味着或 $表示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式不是我的专长 – 期待一些错误 – 但希望前提正常。