nginx 的 location
Nginx中location的作用是根據Url來決定怎么處理用戶請求(轉發請求給其他服務器處理或者查找本地文件進行處理)。location支持正則表達式,配置十分靈活。我們可以在一個虛擬主機(nginx中的一個server節點)下配置多個location以滿足如動靜分離,防盜鏈等需求。
使用Nginx Location可以控制訪問網站的路徑, 但一個server可以有多個location配置, 多個location的優先級該如何區分。
location語法:location [=|~|~*|^~] /uri/ {… },具體解釋如下表:
符號 | 含義 |
---|---|
location = /url | = :開頭,表示精確匹配,uri必須完全一致才能匹配成功 |
location ^~ /Purl | ^~:Puri和請求url的開頭相同就匹配成功,且不再去匹配正則,也屬於普通匹配 |
location /Purl | 普通匹配,Purl和用戶請求url的開頭相同就匹配成功,如果有多個普通匹配都匹配成功則按最長的 。 如有location /static/,和oaction /static/img/ 當請求是www.mysite.com/static/img/1.jpg時,第二個location匹配的更長,所以和第二個loaction匹配成功。 |
location ~ reg | ~ :區分大小寫的正則匹配 |
location ~* reg | ~* :不區分大小寫的正則匹配 |
匹配符 | 匹配規則 | 優先級 |
---|---|---|
= | 精確匹配 | 1 |
^~ | 以某個字符串開頭 | 2 |
~ | 區分大小寫的正則匹配 | 3 |
~* | 不區分大小寫的正則匹配 | 3 |
/ | 通用匹配,任何請求都會匹配到 | 4 |
location案例
通過location案例運用到匹配符來判斷優先級。
server {
listen 80;
server_name _;
不區分大小寫的正則匹配
location ~* /python {
default_type text/html; # 指定類型
return 200 "Location ~*"; # 返回狀態碼為200打印location ~*
}
區分大小寫的正則匹配
location ~ /Python {
default_type text/html;
return 200 "Location ~";
}
以某個字符串開頭
location ^~ /python {
default_type text/html;
return 200 "Location ^~";
}
精確匹配
location = /python {
default_type text/html;
return 200 "Location =";
}
**這里優先級最高的就為 = **
如果把精准匹配 = 注釋掉我們再來看一下這個優先級的變化。
**這里就可以看出來優先級的變化為 ^~ **
最后再來測試一下同級別的 ~ 與 ~* : 通過兩張圖來驗證一下
通過上圖可以發現 在同級別的(~) 與 (~*) 中 location的讀取順序是從上到下依次執行的 所以在上方的優先級大於下方的。