一.location模塊概述
1.定義
location塊是server塊的一個指令。作用:基于Nginx服務器接收到的請求字符串,虛擬主機名稱(ip,域名)、url匹配,對特定請求進行處理。
2.三種匹配類別
精準匹配:location = / {}
一般匹配:location / {}
正則匹配:location ~ / {}
匹配符 | 表示含義 |
---|---|
^ | 匹配輸入字符串的起始位置 |
$ | 匹配輸入字符串的結束位置 |
* | 匹配前面的字符零次或多次。如“ol*”能匹配“o”及“ol”、“oll” |
+ | 匹配前面的字符一次或多次。如“ol+”能匹配“ol”及“oll”、“olll”,但不能匹配“o” |
? | 匹配前面的字符零次或一次,例如“do(es)?”能匹配“do”或者“does”,”?”等效于”{0,1}” |
. | 表示任意一個字符 |
\轉義字符 | 用于取消特殊符號的含義 |
\d | 匹配純數字 |
\s | 匹配空的(空格或者制表符) |
{n} | 匹配前面的子表達式n次 |
{n,} | 匹配前面的子表達式不少于n次 |
{n,m} | 匹配前面的子表達式n到m次 |
[ ] | 匹配括號中的一個字符 |
[c] | 匹配單個字符 c |
[a-z] | 匹配 a-z 小寫字母的任意一個 |
[a-zA-Z0-9] | 匹配所有大小寫字母或數字 |
() | 表達式的開始和結束位置 |
| | 或運算符 |
3.常用的匹配規則
規則表達式 | 規則含義 |
---|---|
= | 進行普通字符精確匹配。也就是完全匹配 |
^~ | 表示普通字符匹配。使用前綴匹配。如果匹配成功,則不再匹配其他 location |
~ | 表示執行一個正則匹配,區分大小寫 |
~* | 表示執行一個正則匹配,不區分大小寫 |
!~ | 表示執行一個正則匹配,區分大小寫不匹配 |
!~* | 表示執行一個正則匹配,不區分大小寫不匹配 |
4.匹配優先級
首先精確匹配 =
其次前綴匹配 ^~
其次是按文件中順序的正則匹配 ~或~*
然后匹配不帶任何修飾的前綴匹配
最后是交給 / 通用匹配
(1)location = / {}
=為精確匹配 / ,主機名后面不能帶任何字符串,比如訪問 / 和 /data,則 / 匹配,/data 不匹配
再比如 location = /abc,則只匹配/abc ,/abc/或 /abcd不匹配。若 location /abc,則即匹配/abc 、/abcd/ 同時也匹配 /abc/。(2)location / {}
因為所有的地址都以 / 開頭,所以這條規則將匹配到所有請求 比如訪問 / 和 /data, 則 / 匹配, /data 也匹配,
但若后面是正則表達式會和最長字符串優先匹配(最長匹配)(3)location /documents/ {}
匹配任何以 /documents/ 開頭的地址,匹配符合以后,還要繼續往下搜索其它 location
只有其它 location后面的正則表達式沒有匹配到時,才會采用這一條(4)location /documents/abc {}
匹配任何以 /documents/abc 開頭的地址,匹配符合以后,還要繼續往下搜索其它 location
只有其它 location后面的正則表達式沒有匹配到時,才會采用這一條(5)location ^~ /images/ {}
匹配任何以 /images/ 開頭的地址,匹配符合以后,停止往下搜索正則,采用這一條(6)location ~* \.(gif|jpg|jpeg)$ {}
匹配所有以 gif、jpg或jpeg 結尾的請求
然而,所有請求 /images/ 下的圖片會被 location ^~ /images/ 處理,因為 ^~ 的優先級更高,所以到達不了這一條正則(7)location /images/abc {}
最長字符匹配到 /images/abc,優先級最低,繼續往下搜索其它 location(8)location ~ /images/abc {}
匹配以/images/abc 開頭的,優先級次之,只有去掉 location ^~ /images/ 才會采用這一條(9)location /images/abc/1.html {}
匹配/images/abc/1.html 文件,如果和正則location ~ /images/abc/1.html 相比,正則優先級更高
優先級總結
(location = 完整路徑) > (location ^~ 路徑) > (location ~,~* 正則順序) > (location 部分起始路徑) > (location /)
location 匹配
首先看 優先級:精確= > 前綴^~ > 正則~,~* > 一般 > 通用/
優先級相同:正則看上下順序,上面的優先;一般匹配看長度,最長匹配的優先
精確、前綴、正則、一般 都沒有匹配到,最后再看通用匹配
三.location模塊使用實例
1.精確匹配優先級小于一般匹配情況
location = / {} 和 location / {} ,按道理應匹配前者,但實際確實匹配后者,匹配只寫域名精確匹配不生效
1. #在配置文件添加匹規則
vim /usr/local/nginx/conf/nginx.conf#默認網頁location / {root html;index index.html index.htm; }#添加的網頁location = / { root /web/test/;}2. #新建網頁站點目錄
mkdir -p /web/test3. #在站點目錄下新建index.html
vim /web/test/index.htmlThis is a test!4. #檢查語法并重啟
nginx -t
systemctl restart nginx.service 5. #在網頁中測試
192.168.79.210
2.解決方法
在/根后加上index.html后生效
1. #修改配置文件
vim /usr/local/nginx/conf/nginx.conflocation = /index.html { # 加上index.html root /web/dog/;}2. #檢查語法、重啟服務
nginx -t
systemctl restart nginx.service 3. #網頁測試
192.168.79.210
3.實際網站使用中的三個匹配規則
(1)第一個必選規則
直接匹配網站根,通過域名訪問網站首頁比較頻繁,使用這個會加速處理,比如說官網。
這里是直接轉發給后端應用服務器了,也可以是一個靜態首頁
location = / {proxy_pass http://tomcat_server/;
}
(2)第二個必須規則是處理靜態文件請求
這是nginx作為http服務器的強項!
有兩種配置模式,目錄匹配或后綴匹配,任選其一或搭配使用
location ^~ /static/ {root /webroot/static/;
}location ~* \.(gif|jpg|jpeg|png|css|js|ico)$ {root /webroot/res/;
}
(3)第三個通用規則
比如用來轉發帶.php、.jsp后綴的動態請求到后端應用服務器
非靜態文件請求就默認是動態請求
location / {proxy_pass http://tomcat_server;
}