Nginx 變數漫談(八)

2021-09-06 20:18:45 字數 2997 閱讀 2392

與 $arg_*** 類似,我們在 (二) 中提到過的內建變數 $cookie_*** 變數也會在名為***的 cookie 不存在時返回特殊值「沒找到」:

location /test

利用curl命令列工具的--cookie name=value選項可以指定name=value為當前請求攜帶的 cookie(通過新增相應的cookie請求頭)。下面是若干次測試結果:

我們看到,cookieuser不存在以及取值為空字串這兩種情況被很好地區分開了:當 cookieuser不存在時,lua **中的ngx.var.cookie_user返回了期望的 luanil值。

在 lua 裡訪問未建立的 nginx 使用者變數時,在 lua 裡也會得到nil值,而不會像先前的例子那樣直接讓 nginx 拒絕載入配置:

location /test

這裡假設我們並沒有在當前的nginx.conf配置檔案中建立過使用者變數$blah,然後我們在 lua **中通過ngx.var.blah直接引用它。上面這個配置可以順利啟動,因為 nginx 在載入配置時只會編譯 content_by_lua配置指令指定的 lua **而不會實際執行它,所以 nginx 並不知道 lua **裡面引用了$blah這個變數。於是我們在執行時也會得到nil值。而 ngx_lua 提供的 ngx.say 函式會自動把 lua 的nil值格式化為字串"nil"輸出,於是訪問/test介面的結果是:

這正是我們所期望的。

上面這個例子中另乙個值得注意的地方是,我們在 content_by_lua 配置指令的引數中提及了$bar符號,但卻並沒有觸發「變數插值」(否則 nginx 會在啟動時抱怨$blah未建立)。這是因為 content_by_lua 配置指令並不支援引數的「變數插值」功能。我們前面在 (一) 中提到過,配置指令的引數是否允許「變數插值」,其實取決於該指令的實現模組。

設計返回「不合法」這一特殊值的例子是困難的,因為我們前面在 (七) 中已經看到,由 set 指令建立的變數在未初始化時確實是「不合法」,但一旦嘗試讀取它們時,nginx 就會自動呼叫其「取處理程式」,而它們的「取處理程式」會自動返回空字串並將之快取住。於是我們最終得到的是完全合法的空字串。下面這個使用了 lua **的例子證明了這一點:

location /foo 

location /bar

請求/foo介面的結果是:

我們看到在 lua 裡面讀取未初始化的 nginx 變數$foo時得到的是空字串。

最後值得一提的是,雖然前面反覆指出 nginx 變數只有字串這一種資料型別,但這並不能阻止像ngx_array_var 這樣的第三方模組讓 nginx 變數也能存放陣列型別的值。下面就是這樣的乙個例子:

location /test

這個例子中使用了 ngx_array_var 模組的array_splitarray_maparray_join這三條配置指令,其含義很接近 perl 語言中的內建函式splitmapjoin(當然,其他指令碼語言也有類似的等價物)。我們來看看訪問/test介面的結果:

我們看到,使用 ngx_array_var 模組可以很方便地處理這樣具有不定個數的組成元素的輸入資料,例如此例中的namesurl 引數值就是由不定個數的逗號分隔的名字所組成。不過,這種型別的複雜任務通過 ngx_lua 來做通常會更靈活而且更容易維護。

至此,本系列教程對 nginx 變數的介紹終於可以告一段落了。我們在這個過程中接觸到了許多標準的和第三方的 nginx 模組,這些模組讓我們得以很輕鬆地構造出許多有趣的小例子,從而可以深入** nginx 變數的各種行為和特性。在後續的教程中,我們還會有很多機會與這些模組打交道。

通過前面討論過的眾多例子,我們應當已經感受到 nginx 變數在 nginx 配置語言中所扮演的重要角色:它是獲取 nginx 中各種資訊(包括當前請求的資訊)的主要途徑和載體,同時也是各個模組之間傳遞資料的主要媒介之一。在後續的教程中,我們會經常看到 nginx 變數的身影,所以現在很好地理解它們是非常重要的。

在下乙個系列的教程,即 nginx 配置指令的執行順序系列 中,我們將深入** nginx 配置指令的執行順序以及請求的各個處理階段,因為很多 nginx 使用者都搞不清楚他們書寫的眾多配置指令之間究竟是按照何種時間順序執行的,也搞不懂為什麼這些指令實際執行的順序經常和配置檔案裡的書寫順序大相徑庭。

Nginx 變數漫談(三)

太棒了 變數漫談 三 rel noopener noreferrer nginx 變數漫談 三 agentzh 也有一些內建變數是支援改寫的,其中乙個例子是 args.這個變數在讀取時返回當前請求的 url 引數串 即請求 url 中問號後面的部分,如果有的話 而在賦值時可以直接修改引數串。我們來看...

Nginx 變數漫談(六)

nginx 內建變數用在 子請求 的上下文中時,其行為也會變得有些微妙。前面在 三 中我們已經知道,許多內建變數都不是簡單的 存放值的容器 它們一般會通過註冊 訪問處理程式 來表現得與眾不同,而它們即使有存放值的容器,也只是用於快取 訪問處理程式 的計算結果。我們之前討論過的 args 變數正是通過...

Nginx 變數漫談(四)

在設定了 取處理程式 的情況下,nginx 變數也可以選擇將其值容器用作快取,這樣在多次讀取變數的時候,就只需要呼叫 取處理程式 計算一次。我們下面就來看乙個這樣的例子 map args foo server 這裡首次用到了標準 ngx map 模組的 map 配置指令,我們有必要在此介紹一下。ma...