在沒有使用正則表達式的時候,nginx會先在server中的多個location選取匹配度最高的一個uri,uri是用戶請求的字符串,即域名后面的web文件路徑,然后使用該location模塊中的正則url和字符串,如果匹配成功就結束搜索,並使用此location處理此請求。
語法規則: location [=|~|~*|^~] /uri/ { … } = 用於標准uri前,需要請求字串與uri精確匹配,如果匹配成功就停止向下匹配並立即處理請求。 ~ 用於標准uri前,表示包含正則表達式並且區分大小寫,並且匹配 !~ 用於標准uri前,表示包含正則表達式並且區分大小寫,並且不匹配 ~* 用於標准uri前,表示包含正則表達式並且不區分大寫,並且匹配 !~* 用於標准uri前,表示包含正則表達式並且不區分大小寫,並且不匹配 ^~ 用於標准uri前,表示包含正則表達式並且匹配以什么開頭 $ 用於標准uri前,表示包含正則表達式並且匹配以什么結尾 \ 用於標准uri前,表示包含正則表達式並且轉義字符。可以轉. * ?等 * 用於標准uri前,表示包含正則表達式並且代表任意長度的任意字符
匹配案例-精確匹配
在server部分使用location配置一個web界面,要求:當訪問nginx 服務器的/login的時候要顯示指定html文件的內容:
[root@s2 ~]# cat /apps/nginx/conf/conf.d/pc.conf server { listen 80; server_name www.magedu.net; location / { root /data/nginx/html/pc; } location = /1.jpg { root /var/www/nginx/images; index index.html; } } 上傳圖片到/var/www/nginx/images,重啟Nginx並訪問測試 訪問測試:http://www.magedu.net/1.jpg
匹配案例-區分大小寫
如果uri中包含大寫字母,則以下location匹配Ax.jpg條件不成功,因為~為區分大小寫,那么當用戶的請求被執行匹配時發現location中定義的是大寫的A,則匹配失敗,即要么繼續往下匹配其他的location(如果有),要么報錯給客戶端。
location ~ /A.?\.jpg { #匹配字母A開頭的圖片,后面?表示A后面零次或一個字符 index index.html; root /opt/nginx/html/image; }
重啟Nginx並訪問測試 將只能訪問以小寫字符的AX.jpg圖片,不能識別大寫的JPG結尾的圖片 訪問測試:http://www.magedu.net/aA.jpg #直接訪問資源名稱即可
匹配案例-不區分大小寫
對用戶請求的uri做模糊匹配,也就是uri中無論都是大寫、都是小寫或者大小寫混合,此模式也都會匹配,通常使用此模式匹配用戶request中的靜態資源並繼續做下一步操作。
正則表達式匹配: # location ~ /A.?\.jpg { # index index.html; # root /opt/nginx/html/image; # } location ~* /A.?\.jpg { 3.3.4.4:匹配案例-URI開始: index index.html; root /opt/nginx/html/image; } 訪問測試:http://www.magedu.net/aA.jpg #直接訪問資源名稱即可 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 精確匹配指定名稱: # location ~ /aa.jpg { # index index.html; # root /opt/nginx/html/image; # } location ~* /aa.jpg { index index.html; root /opt/nginx/html/image; }
重啟Nginx並訪問測試 對於不區分大小寫的location,則可以訪問任意大小寫結尾的圖片文件,如區分大小寫則只能訪問aa.jpg,不區分大小寫則可以訪問aa.jpg以外的資源比如Aa.JPG、aA.jPG這樣的混合名稱文件,但是要求nginx服務器的資源目錄有相應的文件,比如有Aa.JPG有aA.jPG。
重點:
Nginx匹配一次文件名是否區分大小寫
Nginx可以在服務器找到指定的資源
匹配案例-URI開始
location ^~ /images { root /data/nginx; index index.html; } location /images1 { alias /data/nginx/html/pc; index index.html; } 重啟Nginx並訪問測試,實現效果是訪問images和images1返回不同的結果 [root@s2 images]# curl http://www.magedu.net/images/ images [root@s2 images]# curl http://www.magedu.net/images1/ pc web
匹配案例-文件名后綴
[root@s2 ~]# mkdir /data/nginx/images1 #上傳一個和images目錄不一樣內容的的圖片1.j到/data/nginx/images1
location ~* \.(gif|jpg|jpeg|bmp|png|tiff|tif|ico|wmf|js)$ { //此方法多用於動靜分離 root /data/nginx/images1; index index.html; } 重啟Nginx並訪問測試
匹配案例-優先級
location ~* /1.jpg { index index.html; root /data/nginx/pc/html/linux38/images; } location = /1.jpg { #通常用於精確匹配指定文件,如favicon.ico、employcode.js、index.jsp等 index index.html; root /data/nginx/pc/html/python/images; } 上傳圖片到並重啟nginx訪問測試
匹配優先級:=, ^~, ~/~*,/ location優先級:(location =) > (location 完整路徑) > (location ^~ 路徑) > (location ~,~* 正則順序) > (location 部分起始路徑) > (/)
生產使用案例
直接匹配網站根會加速Nginx訪問處理: location = / { ......; } location / { ......; }
靜態資源配置: location ^~ /static/ { ......; } # 或者 location ~* \.(gif|jpg|jpeg|png|css|js|ico)$ { ......; }
多應用配置,tomcat location ~* /app1 { ......; } location ~* /app2 { ......; }