Varnish

如何檢查 varnish 中 cookie 的值

  • January 11, 2012

我有一個語言餅乾。我想檢查此 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

因此我們知道,我們的 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 語句和一個預設值會更安全。

注意:以上內容未經測試,正則表達式不是我的強項——預計會出現一些錯誤——但希望前提有效。

引用自:https://serverfault.com/questions/348830