聊一聊 Nginx 變數(一)

2022-07-23 17:18:25 字數 3260 閱讀 4828

變數可以認為是存放「值」的容器。而所謂「值」,在許多程式語言裡,既可以是3.14這樣的數值,也可以是hello world這樣的字串,甚至可以是像陣列、雜湊表這樣的複雜資料結構。

nginx 的變數和 perl、php 等語言的類似,由美元符號 $ 開頭,隨後跟著乙個字串,代表這個變數的名稱,例如$name,可選地,這個字串可以用花括號包圍,譬如$,合法的變數名可用字符集為 [a-za-z0-9_]。特別地,nginx 支援正則子組,即 $1,$2 這樣的變數。變數值只有字串這一種型別。

例子:nginx.conf檔案中有以下配置:

server 

}

使用curl這個 http 客戶端在命令列上請求這個/test介面,可以得到:

foo: hello我們通過 set 配置指令對變數$foo進行了賦值操作, 把字串hello賦給了它,通過「變數插值」的形式將其拼接到字串中。

1、主要資料結構

1)變數跟蹤結構體

維護 nginx 各模組支援的和配置檔案中用到的變數資訊結構體。

typedef struct  ngx_http_core_main_conf_t;
variables_keys只是在解析時使用的臨時儲存,配置解析完成後,其中的變數資訊會被ngx_http_variables_init_vars轉存到variablesvariables_hash中。

不難知道變數擁有兩種存放方式,第一種是儲存在乙個全域性的 hash 表裡(variables_hash);第二種則是儲存在乙個全域性動態陣列裡(variables),每個變數存在乙個對應的索引。

2)變數資訊結構體

儲存變數屬性、變數set_handlerget_handler和這兩個函式用到的引數值。

struct ngx_http_variable_s ;
變數的屬性是以下幾種屬性的單例或組合:

變數可被覆蓋

不可快取,對於 noncacheable 的變數,每次取值時都需要呼叫其get_handler

儲存在動態陣列中

不儲存在 hash 表中

字首型變數,如arg_cookie_

示例:

static ngx_http_variable_t  ngx_http_fastcgi_vars = ,

};

3)變數值結構體
typedef struct  ngx_variable_value_t;
4)變數獲取介面
/* 獲取沒有索引的變數 */

/* 根據索引獲取變數,對於 nocaheable 變數會重新獲取 */

/* 根據索引獲取變數 */

ngx_http_variable_value_t *ngx_http_get_indexed_variable(ngx_http_request_t *r, ngx_uint_t index);

2、變數分類

1)核心模組ngx_http_core_module提供的(內建)變數

使用ngx_http_core_variables描述, 由preconfiguration**函式ngx_http_variables_add_core_vars進行定義:

...}2)其他功能模組中新增的變數

ngx_http_fastcgi_module提供的變數使用ngx_http_fastcgi_vars描述,由preconfiguration**函式ngx_http_fastcgi_add_variables進行定義:

}3)使用set建立的變數

ngx_http_rewrite_module提供的set指令定義的自定義變數由其配置解析函式ngx_http_rewrite_set進行定義:

上述三種型別變數資訊都被直接 (ngx_hash_add_key) 或間接 (ngx_http_add_variable) 儲存到了variables_keys中。

聊一聊C語言變數

我們知道每乙個程式的執行都需要記憶體,那麼c語言的變數的定義是什麼含義呢?假如我花了200元買了一塊4g記憶體條,然後我定義了乙個inta 就意味著從這4g的記憶體上要拿走4個位元組,又定義了乙個intb 那麼b同樣也要從4g的記憶體條上拿走4位元組。這就是c語言變數的一般含義,每乙個變數實質上都會...

聊一聊js的變數提公升

今天做了變數提公升的題目,發現自己還是一知半解的狀態,以後搞清楚乙個技術點就寫下來記錄一下,儘管自己可能也不知道怎麼表達的會讓大家看的懂,就先慢慢的一步步前進吧,寫多了總比不寫好呀。function getclothing iscold else a.referenceerror freezing ...

聊一聊小甜餅

cookies程式設計 cookie是儲存在客戶端的小文字,儲存的位置分為兩種 cookie可能儲存在客戶端瀏覽器的所佔記憶體中,關閉瀏覽器後,cookies就不再存在。cookie也可能儲存在客戶pc機的硬碟上,設定有效時間,超過有效時間後失效。cookie的常見應用 簡化登入 很多 在登入時,可...