如何在清漆中检查 cookie 的值

Ala*_*ari 2 varnish cookies

我有一个语言饼干。我想检查是否设置了此 cookie 并检查其值以将用户重定向到特定页面。cookie 名称为Lang,其值可能为En、Fr 或 Ar

if (req.http.Cookie ~ "Lang"){
//现在我想检查cookie值
//如果 LANG=="Ar"
// 设置 req.url = req.url "CookieValue"
}

有人知道如何检查清漆中的 cookie 值吗?
谢谢

cyb*_*x86 5

由于所有 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 表示空白
    • * 表示前一个字符的一个或多个重复
    • 摘要:字符串的开头或分号后跟空格
  • 第二组括号 - 匹配 cookie:
    • 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 语句和一个默认值会更安全。

注意:以上内容未经测试,正则表达式不是我的强项 - 期待一些错误 - 但希望前提有效。