nginx location指令詳解

location匹配的是nginx的哪一個變量?

$request_uriphp

location的匹配種類有哪些?

  • =開頭表示精確匹配
  • ^~ 開頭,注意這不是一個正則表達式(是提高優先級的字符串匹配)–它的目的是優先於正則表達式的匹配。若是該location是最佳匹配,則再也不進行正則表達式檢測。
  • ~ 開頭表示區分大小寫的正則匹配;
  • ~* 開頭表示不區分大小寫的正則匹配
  • !~ && !~*:表示區分大小寫不匹配的正則和不區分大小寫的不匹配的正則
  • 字符串匹配
  • /通用匹配, 若是沒有其它匹配,任何請求都會匹配到

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 爲最長的字符串匹配且爲^~匹配方式,因此中止搜索正則,直接命中!)
因此這裏的 ^~ 符號比較特殊,就是爲了提升字符串匹配的優先級,優先於正則匹配.

微信公衆號-php修煉之路

相關文章
相關標籤/搜索