我有一个语言饼干。我想检查是否设置了此 cookie 并检查其值以将用户重定向到特定页面。cookie 名称为Lang,其值可能为En、Fr 或 Ar
if (req.http.Cookie ~ "Lang"){ //现在我想检查cookie值 //如果 LANG=="Ar" // 设置 req.url = req.url "CookieValue" }
有人知道如何检查清漆中的 cookie 值吗?
谢谢
由于所有 cookie - 名称和值 - 都在req.http.Cookie
字符串中,您应该能够同时检查名称和值。不幸的是,Varnish 没有任何专门的方法来处理 cookie——你必须使用正则表达式。
需要注意的是,cookie 由分号和空格分隔,例如:
cookie1=abc; cookie2=def
Run Code Online (Sandbox Code Playgroud)
我们知道,因此我们的 cookie 要么位于 req.http.Cookie 的开头,要么以分号和空格开头,要么以分号结尾,要么位于 req.http.Cookie 的末尾。鉴于此,我们可以构建一个正则表达式来匹配我们的 cookie 和分号(如果有)。就像是:
(^|;\s*)(Lang=En)(;|$)
Run Code Online (Sandbox Code Playgroud)
简而言之,通过上面我们有:
^
表示字符串的开始|
意味着或;
从字面上看(即分号)\s
表示空白*
表示前一个字符的一个或多个重复Lang
是 cookie 的名称En
是 cookie 的值;
从字面上看(即分号)|
意味着或$
表示字符串结束使用上面的方法,我们可以检查 cookie 并对其执行一些操作:
if (req.http.Cookie ~ "(^|;\s*)(Lang=En)(;|$)"){
//do something with En
} elseif (req.http.Cookie ~ "(^|;\s*)(Lang=Fr)(;|$)") {
//do something with Fr;
}
Run Code Online (Sandbox Code Playgroud)
可能有更好的方法,或更有效的正则表达式(不幸的是,varnish 没有用户定义的变量——这意味着你不能使用正则表达式捕获组)——但希望这能完成这项工作。
可以说,您可以使用 regsub 构建一个带有捕获组的正则表达式,并将其设置为子域,可能类似于:
set req.url = regsub(req.http.Cookie, "(?:^|;\s*)(?:Lang=(.*?))(?:;|$)", "\1.")+"example.com";
Run Code Online (Sandbox Code Playgroud)
在'Lang=en' 的情况下,您将捕获'en' 添加一个句点(.) 并在'example.com' 前面加上en.example.com。我建议虽然直接使用 cookie 来设置 URL - 没有很多错误检查 - 将是一个非常糟糕的解决方案。如果你只有 3 种语言,几个 if 语句和一个默认值会更安全。
注意:以上内容未经测试,正则表达式不是我的强项 - 期待一些错误 - 但希望前提有效。
归档时间: |
|
查看次数: |
6908 次 |
最近记录: |