$request_uriphp
=
開頭表示精確匹配^~
開頭,注意這不是一個正則表達式(是提高優先級的字符串匹配)–它的目的是優先於正則表達式的匹配。若是該location是最佳匹配,則再也不進行正則表達式檢測。~
開頭表示區分大小寫的正則匹配;~*
開頭表示不區分大小寫的正則匹配!~
&& !~*
:表示區分大小寫不匹配的正則和不區分大小寫的不匹配的正則/
通用匹配, 若是沒有其它匹配,任何請求都會匹配到=
^~
/
進行通用匹配注意:當有匹配成功時,馬上中止匹配,按照當前匹配規則處理請求html
特別注意:字符串匹配優先搜索,可是隻是記錄下最長的匹配 ,而後繼續搜索正則匹配,若是有正則匹配,則命中正則匹配,若是沒有正則匹配,則命中最長的字符串匹配。 ( 若是 ^~ 是最長的匹配,則會直接命中,中止搜索正則 )nginx
精確匹配 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 爲最長的字符串匹配且爲^~匹配方式,因此中止搜索正則,直接命中!) 因此這裏的 ^~ 符號比較特殊,就是爲了提升字符串匹配的優先級,優先於正則匹配.