Nginx location

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:普通匹配的前後順序是無所謂的,因爲記錄的是最長的結果,而正則匹配是按從上到下匹配的,這個需要注意!!!

優先級 精準匹配>非正則匹配>正則匹配由上到下>普通匹配

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章