Location 知識
Location是快速定位資源的,平時默認都是在根目錄下面,我們可以通過配置Location指令塊,來決定客戶端發過來的請求URI如何處理。(location是根據Uri來進行不同的定位,location可以把網站的不同部分,定位到不同的處理方式上)
語法
location [=|~|~*|^~] patt { } //中括號中爲修飾符,可以不寫任何參數,此時稱爲一般匹配,也可以寫參數
因此,大類型可以分爲四種:
location = patt {} [精準匹配]
location ^~patt{} [忽略正則匹配]
location ~ patt{} [正則匹配]
location patt{} [普通匹配]
location 配置可以有兩種配置方法,可以在server指令塊和location指令塊配置。
1、修飾符(= ~ ~* ^~ @) + uri(資源路徑)
2、@ + name
修飾符
= :精確匹配(必須全部相等)
~ :大小寫敏感(正則表達式)
~* :忽略大小寫(正則表達式),這裏要注意忽略大小寫的意思是請求的字符大小寫都可以,
但是不會進行大小轉換,請求的大小寫對應的文件必須存在。
^~ :只需匹配uri部分
@ :內部服務跳轉
精確匹配
默認是/,即所有的資源都跑到/下面去找,這樣速度比較慢,可以直接定位location=/ location / {
[…]
}
location = /abcd {
[…]
}
http://website.com/abcd匹配,其他的如http://website.com/abcd/,http://website.com/abcde都是不匹配的會返回404
區分大小寫
下面使用echo模塊來測試,測試一下匹配到哪個location,location裏面的jpg資源是可以不存在的,即使用echo打印看調用哪個模塊
location ~/jfedu.jpg {
echo "this is ~/jfedu.jpg";
}
location ~/JFEDU.jgp {
echo "this is ~/JFEDU.jpg";
}
[root@www ~]# curl 192.168.179.99/jfedu.jpg
this is ~/jfedu.jpg
[root@www ~]# curl 192.168.179.99/JFEDU.jgp
this is ~/JFEDU.jpg
可以看到是區分大小寫的,大小寫不一樣匹配到的location是不一樣的
不區分大小寫
location ~* /jfedu.jpg {
echo "this is ~/jfedu.jpg";
}
[root@www ~]# curl 192.168.179.99/jfedu.jpg
this is ~/jfedu.jpg
[root@www ~]# curl 192.168.179.99/JFEDU.jpg
this is ~/jfedu.jpg
[root@www ~]# curl 192.168.179.99/jfedu.JPG
this is ~/jfedu.jpg
這樣寫一個location就行了,不用像上面大小寫敏感寫兩個location。
下面防盜鏈也使用了不區分大小寫
location ~* \.(gif|jpg|png|swf|flv)$ {
valid_referers none blocked lutixia.net *.jfedu.net;
root /usr/share/nginx/html;
if ($invalid_referer) {
return 403;
}}
”@” nginx內部跳轉
location /img/ {
error_page 404 @img_err;
}
location @img_err {
}
以 /img/ 開頭的請求,如果鏈接的狀態爲 404。則會匹配到 @img_err 這條規則上
忽略正則匹配
^~,只匹配以 uri 開頭,匹配成功以後,會停止搜索後面的正則表達式匹配
location ^~/img/{
echo "this is img";
}
只要uri以/img/ 開頭的請求,都會匹配上,不管後面是什麼類型的資源
[root@www ~]# curl 192.168.179.99/img/
this is img
[root@www ~]# curl 192.168.179.99/img/abc
this is img
優先級問題
(1)
location ~* /img/jfedu.jpg {
echo "this is ~*/jfedu.jpg";
}
location ~ /img/jfedu.jpg {
echo "this is ~jfedu.jpg";
}
location = /img/JFEDU.jpg {
echo "this is =/JFEDU.jpg";
}
location ^~/img/{
echo "this is ^~/img/";
}
[root@www ~]# curl 192.168.179.99/img/JFEDU.jpg --可以看到先匹配到的是精準匹配,正則和忽略正則優先級都沒精準高
this is =/JFEDU.jpg
(2)
location ~* /img/jfedu.jpg {
echo "this is ~*/jfedu.jpg";
}
location ~ /img/jfedu.jpg {
echo "this is ~jfedu.jpg";
}
location ^~/img/{
echo "this is ^~/img/";
}
這裏就剩下正則匹配和忽略正則匹配
[root@www ~]# curl 192.168.179.99/img/jfedu.jpg --可以看到先匹配到的是忽略正則,忽略正則優先級比正則要高
this is ^~/img/
(3)
location ~* /img/jfedu.jpg {
echo "this is ~*/jfedu.jpg";
}
location ~ /img/jfedu.jpg {
echo "this is ~jfedu.jpg";
}
[root@www ~]# curl 192.168.179.99/img/jfedu.jpg --可以看到正則之內優先級和順序有關
this is ~*/jfedu.jpg
location命中過程:
1.先進行精準匹配,如果命中立即返回結果並結束解析的過程;
2.精準匹配未命中判斷普通匹配,如果命中多個會記錄下"最長的"命中結果,但不會結束解析;
3.繼續判斷正則匹配,按照正則匹配設置的規則正則表達式進行匹配,如果有多個正則匹配則由上到下進行匹配,一旦匹配成功一個會立即返回結果並結束解析.
ps:普通匹配的前後順序是無所謂的,因爲記錄的是最長的結果,而正則匹配是按從上到下匹配的,這個需要注意!!!
優先級 精準匹配>非正則匹配>正則匹配由上到下>普通匹配