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; ????}? ??} }