首頁 >運維 >Nginx >關於nginx location指令詳解

關於nginx location指令詳解

藏色散人
藏色散人轉載
2020-01-29 13:24:023152瀏覽

關於nginx location指令詳解

location符合的是nginx的哪個變數?

$request_uri

location的符合種類有哪些?

=開頭表示精確比對

##^~ 開頭,注意這不是正規表示式(是提升優先權的字串比對)–它的目的是優先於正規表示式的符合。如果該location是最佳匹配,則不再進行正規表示式檢測。

~ 開頭表示區分大小寫的正規匹配;

~* 開頭表示不區分大小寫的正規符合

!~ && !~*:表示區分大小寫不符的正則和不區分大小寫的不匹配的正則

字串匹配

/通用匹配, 如果沒有其它匹配,任何請求都會匹配到

location搜尋順序

首先精確匹配

=

其次符合

^~

其次是依照設定檔的順序進行正規比對

最後交給/進行通用比對

#注意:

當有匹配成功時,立刻停止匹配,按照當前匹配規則處理請求

特別注意:字符串匹配優先搜索,但是只是記錄下最長的匹配,然後繼續搜尋正則匹配,如果有正則匹配,則命中正則匹配,如果沒有正則匹配,則命中最長的字符串匹配。 ( 如果^~ 是最長的匹配,則會直接命中,停止搜尋正則)

精確匹配

location = /images/test.png {
    echo 'config1';
}
location  /images/test.png {
    echo 'config2';
}
location \/images\/test\.png$ {
    echo 'config3';
}

如果此時請求

http:/ /127.0.0.1/images/test.png 會輸出什麼呢?

輸出

config1, 毋容置疑,精確匹配優先順序最高!

精確符合的特殊情況

location = / {
    index index.html;
}
location / {
    echo 'config2';
}

此時是輸入

http://127.0.0.1 會輸出什麼呢?

是輸出 config2, 怎麼精確匹配的優先權不靈了呢?

是這樣的,精確匹配還是起作用了,請求目錄(非具體文件),nginx會將請求內部定向到index文件,

#既此時真正的請求是

http://127.0.0.1/index.html, 這是config2則被命中!

所以精確匹配不要用來匹配/

字符串搜尋與正規搜尋

location /images/test.png {
    echo 'config1';
}
location ^~ /images/ {
    echo 'config2';
}
location ~ \/images\/test\.png$ {
    echo 'config3';
}
location ~ \/images\/ {
    echo 'config4';
}

如果此時請求

http://127.0.0.1/images/test.png 會輸出什麼呢?

當然是

config3,正規命中

(雖然config1 為最長匹配的字串,此時只做記錄,後面還要搜尋正規匹配,則config3正規匹配命中),

仔細觀察可以發現config4也被匹配成功了,但是正則的匹配順序是按照location的定義順序匹配的,所以config3命中.

##字符字串匹配優先權的提升( ^~ )

location /images/ {
    echo 'config1';
}
location ^~ /images/test.png {
    echo 'config2';
}
location ~ /images/test\.png$ {
    echo 'config3';
}
location ~ \/images\/ {
    echo 'config4';
}
如果此時請求

http://127.0.0.1/images/test.png

會輸出什麼呢? 當然是

config2

, 首部匹配命中(因為字串匹配是優先搜尋的,此時發現config2 為最長的字串匹配且為^~匹配方式,所以停止搜尋正則,直接命中!)

所以這裡的

^~

符號比較特殊,就是為了提高字符串匹配的優先級,優先於正則匹配.相關推薦:《

Nginx教學

以上是關於nginx location指令詳解的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文轉載於:cnblogs.com。如有侵權,請聯絡admin@php.cn刪除