簡單介紹nginx 變數使用

roc_guo發表於2021-08-22
nginx變數簡介

所有的 Nginx變數在 Nginx 配置檔案中引用時都須帶上 $ 字首
在 Nginx 配置中,變數只能存放一種型別的值,有且也只存在一種型別,那就是字串型別

建立變數與賦值

使用了標準 ngx_rewrite 模組的 set 配置指令對變數  $a 進行了賦值操作

set $hello "hello world";
Perl的變數插值

這裡使用變數方法,直接寫在雙引號內,perl將檢查引號內的每個字元,看看是否有特殊定義, 然後將它替換為其內容,這叫做變數插值
寫在單引號內會則是原文不會改變
當然有些語法中不加算引號,直接寫內容也是可以的

set $hello "hello world";
print "this is $hello  .";
大括號插值

在“變數插值”的上下文中,還有一種特殊情況,即當引用的變數名之後緊跟著變數名的構成字元時(比如後跟字母、數字以及下劃線),我們就需要使用特別的記法(${變數名})來消除歧義

set $hello "hello";
print "this is ${hello}World .";
輸出 $ 符

在nginx中  $ 字元給轉義是不支援的,但我們可以透過不支援“變數插值”的模組配置指令專門構造出取值為  $ 的 Nginx 變數,然後再在 echo 中使用這個變數。
這裡用到了標準模組ngx_geo提供的配置指令geo來為變數  $dollar 賦予字串  $ ,這樣我們在下面需要使用美元符的地方,就直接引用我們的  $dollar 變數就可以了

geo $dollar {
    default "$";
}
server {
    listen 8080;
    location /test {
        echo "This is a dollar sign: $dollar";
    }
}
變數建立,賦值及作用域問題

變數的建立和賦值操作發生在全然不同的時間階段。Nginx 變數的建立只能發生在 Nginx 配置載入的時候,或者說 Nginx 啟動的時候;而賦值操作則只會發生在請求實際處理的時候。這意味著不建立而直接使用變數會導致啟動失敗,同時也意味著我們無法在請求處理時動態地建立新的 Nginx 變數。
例:

set $hello "hello";
print "this is ${hello}World .";

如set指令中,nginx啟動後是存在變數 $hello的,但是隻有真正執行到該地方時,變數才賦值了

Nginx 變數一旦建立,其變數名的可見範圍就是整個 Nginx 配置,甚至可以跨越不同虛擬主機的 server 配置塊
Nginx變數名的可見範圍雖然是整個配置,但每個請求都有所有變數的獨立副本,或者說都有各變數用來存放值的容器的獨立副本,彼此互不干擾
例:

server {
       listen 8080;
       location /foo {
           echo "foo = [$foo]";
       }
       location /bar {
           set $foo 32;
           echo "foo = [$foo]";
       }
   }

結果:

  $ curl '
    foo = []
 
    $ curl '
    foo = [32]
 
    $ curl '
    foo = []

從這個例子我們可以看到,set 指令因為是在  location /bar 中使用的,所以賦值操作只會在訪問  /bar 的請求中執行。而請求  /foo 介面時,我們總是得到空的  $foo 值,因為使用者變數未賦值就輸出的話,得到的便是空字串。

Nginx變數值容器的生命期是與當前正在處理的請求繫結的,而與location無關。
有一種方式叫內部跳轉,意思是在處理請求的過程中,於伺服器內部,從一個 location 跳轉到另一個 location 的過程,這時候這些location是共用一套Nginx量的容器副本的
例:

 server {
        listen 8080;
 
        location /foo {
            set $a hello;
            echo_exec /bar;
        }
 
        location /bar {
            echo "a = [$a]";
        }
    }

結果

 $ curl localhost:8080/foo
a = [hello]
 $ curl localhost:8080/bar
a = []

這時候如果訪問 localhost:8080/foo,就會跳轉到 /bar,輸出結果 a = [hello],但是如果直接訪問 localhost:8080/bar,輸出結果則為 a = [],因為 $a變數沒有賦值


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/69901823/viewspace-2788194/,如需轉載,請註明出處,否則將追究法律責任。

相關文章