無法在 nginx 的 “if” 正規表示式中使用變數?

Rubto發表於2019-09-10

背景

公司為所有縣域電視臺開發了一套新媒體管理後臺系統,為每個電視臺使用唯一的 Token 作為標識。現針對電視臺的微信投票日誌做統計,其中需要把投票使用者的 Cookie 記錄到 Nginx 投票日誌中,但使用者的 Cookie 鍵名中有電視臺 Token 做標識,所以在 Nginx 中加入正則進行匹配 Cookie 變數名的操作。

程式碼實現

  1. 首先在 Nginx 的主配置檔案 nginx.conf 中定義好 log_format 日誌格式,這裡展示一些主要的日誌配置資訊
    log_format cookie_log '$time_local -- $remote_addr -- "$host" -- ... -- "$http_x_forwarded_for" -- $union_cookie -- $http_cookie';
  2. 在 Server 塊中對獲取 Cookie 進行相關配置

    sever {
            ...
            access_log /var/log/access_log union_log;
    
            set_unescape_uri $token $arg_token;   #儲存Cookie的鍵名的引數
            set $union_token_name "wechaid_$token";
    
            set $union_cookie "";
            if ($http_cookie ~* "$union_token_name=(.+?)(?=;|$)") {
                set $union_cookie $1;
            }
            ...
    }

問題

if 正規表示式中使用 $union_token_name 變數的匹配測試不生效,我試著把 $union_token_name 變數內容替換成字串卻可以獲取到 Cookie 的值。

相關文章