Nginx之匹配規則

概念:

我們可以通過配置Location指令塊,來決定客戶端發過來的請求URI如何處理。

語法:

Syntax: location [ = | ~ | ~* | ^~ ] uri { … }
location @name { … }
Default: —
Context: server, location
location 配置可以有兩種配置方法,可以在server指令塊和location指令塊配置。

1、修飾符 + uri(資源路徑)

2、@ + name

修飾符:

=  :精確匹配(必須全部相等)
 ~  :大小寫敏感(正則表達式)
 ~* :忽略大小寫(正則表達式),這裏要注意忽略大小寫的意思是請求的字符大小寫都可以,
 但是不會進行大小轉換,請求的大小寫對應的文件必須存在。
 ^~ :只需匹配uri部分
 @  :內部服務跳轉
Location 配置實例:

1、=,精確匹配,一般是匹配某個具體文件。

location = /index.html {
[ configuration ]
}
則匹配到http://www.lutixia.com/index.html這種請求。
還有這種寫法,精準匹配/,可以加快首頁訪問速度。

location = / {
root html;
index index.html;
}
有一點需要注意,如果想變更根目錄,比如把根目錄設置爲/usr/local/nginx/html/lutixia,那麼直接這麼寫可能會出問題,假如原根目錄(html)沒有index.html文件,會報404。

location = / {
root /usr/local/nginx/html/lutixia;
index index.html;
}
如果寫成這樣的話,即使lutixia目錄下有index.html,也會直接報錯,
報找不到文件,可是裏面明明有文件呀。
解釋:
當我們訪問www.lutixia.com/時,確實匹配到了這個location,
但是這個時候請求的前綴會變成/index.html,所以已經不再匹配這個localtion規則。
因爲找不到其他匹配規則,
所以默認會去匹配根目錄下(html)的文件,但是這時根目錄下的index.html不存在,
所以報錯404。
同樣的,如果lutixia目錄裏面有其他的文件,我們通過這個localtion規則也是無法訪問的, 因爲它只匹配/,其他的url都不再是它匹配。

那麼怎麼解決這個問題呢?可以在加一個location。
location = / {
root html/lutixia;
index index.html;
}
location / {
root html/lutixia;
index index.html;
}

通過加這個location,凡是沒有匹配到的資源會到/目錄下去找
,根的目錄重新定義了,所以可以實現這個需求。
2、~,大小寫敏感(正則表達式)

location ~ /LUTIXIA/ {
[ configuration ]
}
#請求示例
#http://www.lutixia.com/LUTIXIA/ [成功]
#http://www.lutixia.com/lutixia/ [失敗]
3、~*,大小寫忽略(正則表達式)

location ~* /LUTIXIA/ {
[ configuration ]
}

則會忽略 uri 部分的大小寫

#http://www.lutixia.com/LUTIXIA/ [成功] 可以成功匹配,但是目錄中要LUTIXIA文件
#http://www.lutixia.com/lutixia/ [成功] 可以成功匹配,但是目錄中要lutixia文件
4、^~,只匹配以 uri 開頭,匹配成功以後,會停止搜索後面的正則表達式匹配

location ^~ /img/ {
[ configuration ]
}
#以 /img/ 開頭的請求,都會匹配上
#http://www.lutixia.com/img/lutixia.jpg [成功]
#http://www.lutixia.com/img/lutixia.png [成功]
5、匹配以gif、jpg、jpeg結尾的文件

location ~* .(gif|jpg|jpeg)$ {
[ configuration ]
}
#http://www.lutixia.com/img/lutixia.jpg [成功]
如果配置了4,那麼所有請求 /img/ 下的圖片會被上面4處理,因爲 ^~ 指令匹配到了,則不檢查正則表達式。

5、@,nginx內部跳轉

location /data/ {
error_page 404 @img_err;
}

location @img_err {
[ configuration ]
}
#以 /data/ 開頭的請求,如果鏈接的狀態爲 404。則會匹配到 @img_err 這條規則上。
同時有多個location時,優先級如下:
完整範例:
這裏有一簡短的localtion配置:

    location  /img/ {
            echo " /img/";
    }
    location ~ /img/ {
            echo "~ /img/";
    }
    location ~* /img/ {
            echo "~* /img/";
    }
    location ^~ /img/ {
            echo "^~ /img/";
    }
    location = /img/ { 
            echo "=  /img/";
    }

如果客戶端的請求是:

http://192.168.0.116/img/
那麼按照匹配規則順序應該是這樣的:

第一步:取出uri:/img/

第二步:去匹配localtion規則,查找有沒有 = /img/的規則,有則停止匹配。

[root@www ~]# curl 192.168.0.116/img/
= /img/
第三步:將location = /img/規則註釋,繼續查找有沒有 ^~ /img/的規則,

[root@www ~]# curl 192.168.0.116/img/
^~ /img/
第四步:將 location ^~ /img/註釋,這是它會去查找有沒有正則匹配規則。

location /img/ {
echo " /img/";
}
location ~ /img/ {
echo “~ /img/”;
}
location ~* /img/ {
echo “~* /img/”;
}
location ^~ /img/ {
echo “^~ /img/”;
}
location = /img/ {
echo “= /img/”;
}

其中,第一個和的第二個規則都是正則,這時會按照至上而下的順序匹配。

[root@www ~]# curl 192.168.0.116/img/
/img/
第五步:其他的都註釋後,因爲優先匹配規則都沒有找到,最後匹配到 /img/規則。

[root@www ~]# curl 192.168.0.116/img/

轉載:https://www.zhihu.com/tardis/sogou/art/75157470

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