目錄
一、Nginx Rewrite概述
二、Nginx Rewrite基本操作
三、案例
1、基於域名的跳轉
2、基於客戶端 IP 訪問跳轉
3、基於舊域名跳轉到新域名后面加目錄
4、基於參數匹配(多余的)的跳轉
5、基於目錄下所有 php 結尾的文件跳轉
6、基於最普通一條 url 請求的跳轉
一、Nginx Rewrite概述
location是為了匹配訪問的路徑(URL)
URL:就是一個具體路徑/位置
URI:指的是一個擁有相同類型/特性的對象集合
Rewrite跳轉場景
URL看起來更規范、合理
企業會將動態URL地址偽裝成靜態地址提供服務
網址換新域名后,讓舊的訪問跳轉到新的域名上
服務端某些業務調整
Rewrite跳轉實現
1.Nginx是通過ngx_http_rewrite_module模塊支持url重寫、支持if條件判斷,但不支持else。
(Nginx哪些模塊:核心/全局模塊、HTTP模塊、server模塊、location if rewrite)
2.另外該模塊需要PCRE支持,應在編譯Nginx時指定PCRE支持,默認已經安裝。
3.根據相關變量重定向和選擇不同的配置,從一個location跳轉到另一個location,不過這樣的循環最多可以執行10次,超過后Nginx將返回500錯誤。
4.同時,重寫模塊包含set指令,來創建新的變量並設其值,這在有些情景下非常有用的,如記錄條件標識、傳遞參數到其他location、記錄做了什么等等。
Rewrite實際場景
Nginx跳轉需求的實現方式
使用rewrite進行匹配跳轉
使用if匹配全局變量后跳轉
使用location匹配再跳轉(匹配的訪問 路徑URL location可以匹配本地的重寫以及跨服務器的跳轉)
rewrite放在server{}, if{},location{}段中
(多個server模塊 sever模塊里包含location location包含if if里面包含rewrite)
location只對域名后邊的除去傳遞參數外的字符串起作用
對域名或參數字符串
使用if全局變量匹配
使用proxy_pass反向代理
Nginx正則表達式(什么是正則表達式:正則是作為精確匹配、過濾、篩選的一種執行規范)
作用:1、精確匹配,減少遍歷的消耗
2、節省服務響應的資源消耗
3、提高用戶體驗感
4、提高服務器並發時、處理效率/性能
Nginx使用正則的作用:
Nginx作為運維角度前段接受、想用客戶請求的直接對服務器所以需要考慮到Nginx的執行效率(精確匹配-類比)、性能(資源消耗)、抗壓能力(高並發時處理能力)、用戶體驗感(用戶訪問群體)
^ :匹配輸入字符串的起始位置
$ :匹配輸入字符串的結束位置
* :匹配前面的字符零次或多次。如“ol*”能匹配“o”及“ol”、“oll”
+ :匹配前面的字符一次或多次。如“ol+”能匹配“ol”及“oll”、“olll”,但不能匹配“o”
? :匹配前面的字符零次或一次,例如“do(es)?”能匹配“do”或者“does”,”?”等效於”{0,1}”
. :匹配除“\n”之外的任何單個字符,若要匹配包括“\n”在內的任意字符,請使用諸如“[.\n]”之類的模式
\ :將后面接着的字符標記為一個特殊字符或一個原義字符或一個向后引用。如“\n”匹配一個換行符,而“\$”則匹配“$”
\d :匹配純數字
\w :匹配字母或數字或下划線或漢字
\s :匹配任意的空白符
\b :匹配單詞的開始或結束
{n} :重復 n 次
{n,} :重復 n 次或更多次
{n,m} :重復 n 到 m 次
[] :定義匹配的字符范圍
[c] :匹配單個字符 c
[a-z] :匹配 a-z 小寫字母的任意一個
[a-zA-Z0-9] :匹配所有大小寫字母或數字
() :表達式的開始和結束位置 例如:(jpg|gif|swf|)
| :或運算符
Rewrite命令語法
last和break比較
last break
使用場景 一般寫在server和if中 一般使用在location中
URL匹配 不終止重寫后的url匹配 終止重寫后的url匹配
location的分類
精准匹配:location = / {…} 示例: location = patt {} PS: 精確匹配字符串
一般匹配:location / {…} 示例: location patt {} PS: 只要包含patt的字符串即可
正則匹配:location ~ / {…} 示例: location ~ patt {} PS: 按照正則表達式的方式匹配
location 常用的匹配規則
=:進行普通字符精確匹配,也就是完全匹配
^~:表示普通字符匹配。使用前綴匹配。如果匹配成功,則不再匹配其他 location
~:區分大小寫的匹配
~*:不區分大小寫的匹配
!~:區分大小寫的匹配取非
!~*:不區分大小寫的匹配取非
@:定義一個location,使用在內部定向的時候
location 優先級
相同類型的表達式,字符串長的優先匹配
原則:越精確、越優先
首先精確匹配 =
其次前綴匹配 ^~(匹配普通字符、且為前綴匹配)
其次是按文件中順序的正則匹配 ~或~*(宏觀而言——》是否區分大小寫)
然后匹配不帶任何修飾的前綴匹配,示例:/images/abc/(location /patt)
最后是交給 / 通用匹配
location 示例說明
location 優先級總結
匹配某個具體文件
(location = 完整路徑) > (location ^~ 完整路徑) > (location ~* 完整路徑) > (location ~ 完整路徑) > (location 完整路徑) > (location /)
location ~* 完整路徑 > location ~ 完整路徑 /path
用目錄做匹配訪問某個目錄
(location = 目錄) > (location ^~ 目錄/) > (location ~ 目錄) > (location ~* 目錄) > (location 目錄) > (location /)
實際網站使用中,三個匹配規則定義
#第一個必選規則
直接匹配網站根,通過域名訪問網站首頁比較頻繁(www.baidu.com/),使用這個會加速處理,比如說官網。
可以是一“個靜態首頁,也可以直接轉發給后端“應用服務器” ——》PHP 、Apache
location = / {
root html;
index index.html index. htm;
}
#第二個必選規則是處理靜態文件請求,這是nginx作為http服務器的強項(1、靜態請求處理的能力+ 高並發處理能力+資源消耗較低)
有兩種配置模式,目錄匹配或后綴匹配,任選其一或搭配使用
location ^~ /static/ {
root /webroot/static/ ;
}
location ~* \. (html Igif ljpg ljpeglpnglcssljslico)$ {
root /webroot/res/ ;
}
#⭐⭐⭐⭐第三個規則就是通用規則,比如用來轉發帶.php、.jsp后綴的動態請求到后端應用服務器
非靜態文件請求就默認是動態請求(跳轉/反向代理)
upstream tomcat_server {
server 192.168.226.128:8080 weight 1;
server 192.168.226.132:8080 weight 1;
}
location ^/ \.(php|jsp)$ {
proxy_pass http://tomcat_server;
}
比較rewrite和location
相同點:
都能實現跳轉
不同點:
rewrite是在同一域名內更改獲取資源的路徑
location是對一類路徑做控制訪問或反向代理,還可以proxy_pass到其他機器
rewrite改寫訪問的URL路徑(被訪問的HTML/HTM/CSS文件)
location對一類地址進行權限控制(認證控制)+跳轉(跨服務器進行URL跳轉)
rewrite會寫location里,執行順序
執行server塊里面的rewrite指令
執行location匹配
執行選定的location中的rewrite指令
理論總結
rewrite:基本概念、應用場景、使用特點
rewrite執行方式三種
rewrite regex replacement flag
location 優先級
location 和rewrite區別
三、案例
1、基於域名的跳轉
#添加映射
vim /etc/hosts
192.168.226.132 www.benet.com www.kgc.com
#創建日志目錄
mkdir -p /var/log/nginx/
#修改配置文件
vim /usr/local/nginx/conf/nginx.conf
#在usr/local/nginx/html
創建個test.html
此時訪問 www.kgc.com 時會自動跳轉到 www.benet.com 上進行訪問。
訪問www.kgc.com/test.html 時會自動跳轉到 www.benet.com/test.html 上進行訪問。
2、基於客戶端 IP 訪問跳轉
今天公司業務新版本上線,要求所有(外部來訪) IP 訪問任何內容都顯示一個固定維護頁面,只有公司 IP 192.168.147.3訪問正常。
① 刪除上一個實驗的配置
mkdir -p /var/www/html
echo '<h1>this is weihu web!</h1>' > /var/www/html/weihu.html
systemctl restart nginx.service
其他主機訪問頁面
192.168.147.4訪問頁面
整理下:1、set $rewrite true; ->目的:給所有client端打上true標簽
2、if($remote_addr='192.168.147.4')
3、if($rewrite=true)對於具有true標簽的來源,進行全部匹配,並且重寫路徑為weihu.html
4、location=/weihu.html 匹配訪問路徑為/weihu.html的請求,指向頁面的文件位置(路徑)
3、基於舊域名跳轉到新域名后面加目錄
當訪問的是 http://bbs.kgc.com/post/1.html 會自動跳轉到 http://www.benet.com/bbs/post/1.html
#創建指定目錄
mkdir -p /usr/local/nginx/html/bbs/post
echo "<h1> this is 1.html </h1>" >> /usr/local/nginx/html/bbs/post/1.html
echo "192.168.147.4 bbs.kgc.com" >> /etc/hosts
systemctl restart nginx.service
此時用瀏覽器訪問 http://bbs.kgc.com/post/1.html 會自動跳轉到 http://www.benet.com/bbs/post/1.html
4、基於參數匹配(多余的)的跳轉
現在訪問 http://www.kgc.com/100-(100|200)-100.html 會跳轉到 http://www.kgc.com的頁面
使用瀏覽器訪問 http://www.kgc.com/100-100-100.html 或 http://www.kgc.com/100-200-100.html會自動跳轉到 http://www.kgc.com頁面
5、基於目錄下所有 php 結尾的文件跳轉
要求訪問 http://www.kgc.com/upload/123.php 跳轉到首頁www.kgc.com (場景:注冊/登陸)
瀏覽器訪問 http://www.kgc.com/upload/123.php 跳轉到 http://www.kgc.com 首頁
6、基於最普通一條 url 請求的跳轉