如何檢查 varnish 中 cookie 的值
我有一個語言餅乾。我想檢查此 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 語句和一個預設值會更安全。
注意:以上內容未經測試,正則表達式不是我的強項——預計會出現一些錯誤——但希望前提有效。