如何检查 Varnish 中的 cookie 的值

如何检查 Varnish 中的 cookie 的值

我有一个用于语言的 cookie。我想检查此 cookie 是否已设置,并检查其值以将用户重定向到特定页面。cookie 名称是它的值可能是上、下、或上

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

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

答案1

由于所有 cookie(名称和值)都在字符串中req.http.Cookie,因此您应该能够同时检查名称和值。不幸的是,Varnish 没有任何专门处理 cookie 的方法 - 您必须使用正则表达式。

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

cookie1=abc; cookie2=def

因此,我们知道我们的 cookie 要么位于 req.http.Cookie 的开头,要么以分号和空格开头,要么以分号结尾,要么位于 req.http.Cookie 的末尾。鉴于此,我们可以构造一个正则表达式来匹配我们的 cookie 和分号(如果有)。例如:

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

简而言之,通过上述内容,我们可以得出:

  • 第一组括号 - 匹配开始:
    • ^表示字符串的开始
    • |表示或
    • ;按字面意思理解(即分号)
    • \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;
}

可能有更好的方法或更有效的正则表达式(不幸的是,Varnish 没有用户定义的变量 - 这意味着您不能使用正则表达式捕获组) - 但希望这能完成工作。

可以说,您可以使用 regsub 构建一个带有捕获组的正则表达式,并将其设置为子域,可能类似于:

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

如果是“Lang=en”,您可以捕获“en”并添加句点 (.),然后将其添加到“example.com”前面,这样您就得到了 en.example.com。但我建议直接使用 cookie 来设置 URL(没有进行大量错误检查)将是一个非常糟糕的解决方案。如果您只有 3 种语言,那么几个 if 语句和一个默认值会更安全。

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

相关内容