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 為最長的字串匹配且為^~匹配方式,所以停止搜索正則,直接命中!)
所以這里的 ^~ 符號比較特殊,就是為了提高字串匹配的優先級,優先于正則匹配.

轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/84976.html
標籤:PHP
上一篇:淺析PHP類的自動加載和命名空間
下一篇:php 使用 CURL 獲取資料
