1. 程式人生 > >Nginx Location指令URI匹配規則詳解

Nginx Location指令URI匹配規則詳解

1、介紹

location指令是http模組當中最核心的一項配置,根據預先定義的URL匹配規則來接收使用者傳送的請求,根據匹配結果,將請求轉發到後臺伺服器、非法的請求直接拒絕並返回403、404、500錯誤處理等。

2、location指令語法

location [=|~|~*|^~|@] /uri/ { … } 或 location @name { … }

3、URI匹配模式

location指令分為兩種匹配模式:
1> 普通字串匹配:以=開頭或開頭無引導字元(~)的規則
2> 正則匹配:以~或~*開頭表示正則匹配,~*表示正則不區分大小寫

4、location URI匹配規則

當nginx收到一個請求後,會擷取請求的URI部份,去搜索所有location指令中定義的URI匹配模式。在server模組中可以定義多個location指令來匹配不同的url請求,多個不同location配置的URI匹配模式,總體的匹配原則是:先匹配普通字串模式,再匹配正則模式。只識別URI部份,例如請求為:/test/abc/user.do?name=xxxx
一個請求過來後,Nginx匹配這個請求的流程如下:
1> 先查詢是否有=開頭的精確匹配,如:location = /test/abc/user.do { … }
2> 再查詢普通匹配,以 最大字首 為原則,如有以下兩個location,則會匹配後一項
* location /test/ { … }
* location /test/abc { … }
3> 匹配到一個普通格式後,搜尋並未結束,而是暫存當前匹配的結果,並繼續搜尋正則匹配模式
4> 所有正則匹配模式location中找到第一個匹配項後,就以此項為最終匹配結果
所以正則匹配項匹配規則,受定義的前後順序影響,但普通匹配模式不會
5> 如果未找到正則匹配項,則以3中快取的結果為最終匹配結果
6> 如果一個匹配都沒搜尋到,則返回404

5、精確匹配與模糊匹配差別

location =/ { … } 與 location / { … } 的差別:
* 前一個是精確匹配,只響應/請求,所有/xxx或/xxx/xxxx類的請求都不會以字首的形式匹配到它
* 後一個是隻要以 / 為字首的請求都會被匹配到。如:/abc , /test/abc, /test/abc/aaaa

6、正則與非正則匹配

1> location ~ /test/.+.jsp$ { … } :正則匹配,支援標準的正則表示式語法。
2> location ^~ / { … } : ^~意思是關閉正則匹配,當搜尋到這個普通匹配模式後,將不再繼續搜尋正則匹配模式。

...
http { ... server { listen 80; server_name localhost; location / { root html; index index.html index.htm; # deny all; 拒絕請求,返回403 # allow all; 允許請求 } location /abc { deny all; } location ~ /.+\.jsp$ { proxy_pass http://location:9090; } # 匹配所有/test路徑下的jsp檔案 location ~ /test/.+\.jsp$ { proxy_pass http://localhost:8080; } # 定義各類錯誤頁 error_page 404 /404.html error_page 500 502 503 504 /50x.html; location = /50x.html { root html; } # @類似於變數定義 # error_page 403 http://blog.csdn.net; #這種定義不允許,需求利用@定義臨時變數來實現 error_page 403 @page403; location @page403 { proxy_pass http://blog.csdn.net; } } }