Nginx之rewrite重寫的具體使用
一、rewrite概述
1、rewrite功能
訪問重寫 rewrite 是 Nginx HTTP 請求處理過程中的一個(gè)重要功能,它是以模塊的形式存在于代碼中的,其功能是對用戶請求的 URI 進(jìn)行 PCRE 正則重寫,然后返回 30× 重定向跳轉(zhuǎn)或按條件執(zhí)行相關(guān)配置。
Nginx服務(wù)器利用 ngx_http_rewrite_module 模塊解析和處理rewrite請求,此功能依靠 PCRE(perl compatible regular expression),因此編譯之前要安裝PCRE庫,rewrite是nginx服務(wù)器的重要功能之一,用于實(shí)現(xiàn)URL的重寫,URL的重寫是非常有用的功能,比如它可以在我們改變網(wǎng)站結(jié)構(gòu)之后,不需要客戶端修改原來的書簽,也無需其他網(wǎng)站修改我們的鏈接,就可以設(shè)置為自動(dòng)訪問,另外還可以在一定程度上提高網(wǎng)站的安全性。
2、跳轉(zhuǎn)場景
Rewrite 跳轉(zhuǎn)場景主要包括以下幾種
- 可以調(diào)整用戶瀏覽的 URL,看起來更規(guī)范,合乎開發(fā)及產(chǎn)品人員的需求
- 為了讓搜索引擎搜錄網(wǎng)站內(nèi)容及用戶體驗(yàn)更好,企業(yè)會(huì)將動(dòng)態(tài) URL 地址偽裝成靜態(tài)地址提供服務(wù)
- 網(wǎng)址換新域名后,讓舊的訪問跳轉(zhuǎn)到新的域名上。例如,訪問京東的 360buy.com會(huì)跳轉(zhuǎn)到 jd.com
- 根據(jù)特殊變量、目錄、客戶端的信息進(jìn)行 URL 調(diào)整等。
二、標(biāo)準(zhǔn)配置指令
1、rewrite日志記錄指令
名稱 | rewrite 日志記錄指令 |
---|---|
指令 | rewrite_log |
作用域 | http, server, location |
默認(rèn)值 | off |
指令值選項(xiàng) | on 或 off |
指令說明 | 當(dāng)指令值為 on 時(shí),rewrite 的執(zhí)行結(jié)果會(huì)以 notice 級別記錄到 Nginx 的 error 日志文件中 |
配置樣例如下:
http { rewrite_log off; }
2、未初始化變量告警日志記錄指令
名稱 | 未初始化變量告警日志記錄指令 |
---|---|
指令 | uninitialized_variable_warn |
作用域 | http, server, location |
默認(rèn)值 | on |
指令值選項(xiàng) | on 或 off |
指令說明 | 指令值為 on 時(shí),會(huì)將未初始化的變量告警記錄到日志中 |
配置樣例如下:
http { uninitialized_variable_warn off; }
3、rewrite 指令
通過正則表達(dá)式的匹配來改變URI,可以同時(shí)存在一個(gè)或多個(gè)指令,按照順序依次對URI進(jìn)行匹配,rewrite主要是針對用戶請求的URL或者是URI做具體處理
名稱 | rewrite 指令 |
---|---|
指令 | rewrite |
作用域 | server, location,if |
默認(rèn)值 | on |
指令值選項(xiàng) | on 或 off |
指令說明 | 對用戶的 URI 用正則表達(dá)式的方式進(jìn)行重寫,并跳轉(zhuǎn)到新的 URI |
配置樣例如下:
http { rewrite ^/users/(.*)$ /show?user=$1 last; }
rewrite 訪問重寫是通過 rewrite 指令實(shí)現(xiàn)的,rewrite 指令的語法格式如下:
rewrite regex replacement [flag];
注意:
1) regex 是 PCRE 語法格式的正則表達(dá)式。
2) replacement 是重寫 URI 的改寫規(guī)則。當(dāng)改寫規(guī)則以"http://""https://"或"$scheme"開頭時(shí),Nginx 重寫該語句后將停止執(zhí)行后續(xù)任務(wù),并將改寫后的 URI 跳轉(zhuǎn)返回客戶端。
3) flag 是執(zhí)行該條重寫指令后的操作控制符。操作控制符有如下 4 種:
- last:執(zhí)行完當(dāng)前重寫規(guī)則跳轉(zhuǎn)到新的 URI 后繼續(xù)執(zhí)行后續(xù)操作;
- break:執(zhí)行完當(dāng)前重寫規(guī)則跳轉(zhuǎn)到新的 URI 后不再執(zhí)行后續(xù)操作。不影響用戶瀏覽器 URI 顯示;
- redirect:返回響應(yīng)狀態(tài)碼 302 的臨時(shí)重定向,返回內(nèi)容是重定向 URI 的內(nèi)容,但瀏覽器網(wǎng)址仍為請求時(shí)的 URI;
- permanent:返回響應(yīng)狀態(tài)碼 301 的永久重定向,返回內(nèi)容是重定向 URI 的內(nèi)容,瀏覽器網(wǎng)址變?yōu)橹囟ㄏ虻?URI。
rewrite將用戶請求的URI基于regex所描述的模式進(jìn)行檢查,匹配到時(shí)將其替換為表達(dá)式指定的新的URI。如果在同一級配置塊中存在多個(gè)rewrite規(guī)則,那么會(huì)自下而下逐個(gè)檢查;被某條件規(guī)則替換完成后,會(huì)重新一輪的替換檢查,隱含有循環(huán)機(jī)制,但不超過10次;如果超過,提示500響應(yīng)碼,[flag]所表示的標(biāo)志位用于控制此循環(huán)機(jī)制如果替換后的URL是以http://或https://開頭,則替換結(jié)果會(huì)直接以重定向返回給客戶端, 即永久重定向 301。
3.1 正則表達(dá)式
符號 | 功能描述 |
. | 匹配除換行符以外的任意字符 |
\w | 匹配字母或數(shù)字或下劃線或漢字 |
\s | 匹配任意的空白符 |
\d | 匹配數(shù)字 [0-9] |
\b | 匹配單詞的開始或結(jié)束 |
^ | 匹配字付串的開始 |
$ | 匹配字符串的結(jié)束 |
* | 匹配重復(fù)零次或更多次 |
+ | 匹配重復(fù)一次或更多次 |
? | 匹配重復(fù)零次或一次 |
(n) | 匹配重復(fù)n次 |
{n,} | 匹配重復(fù)n次或更多次 |
{n,m} | 匹配重復(fù)n到m次 |
*? | 匹配重復(fù)任意次,但盡可能少重復(fù) |
+? | 匹配重復(fù)1次或更多次,但盡可能少重復(fù) |
?? | 匹配重復(fù)0次或1次,但盡可能少重復(fù) |
{n,m}? | 匹配重復(fù)n到m次,但盡可能少重復(fù) |
{n,}? | 匹配重復(fù)n次以上,但盡可能少重復(fù) |
\W | 匹配任意不是字母,數(shù)字,下劃線,漢字的字符 |
\S | 匹配任意不是空白符的字符 |
\D | 匹配任意非數(shù)字的字符 |
\B | 匹配不是單詞開頭或結(jié)束的位置 |
[^x] | 匹配除了x以外的任意字符 |
[^kgc] | 匹配除了kgc 這幾個(gè)字母以外的任意字符 |
三、rewrite模塊使用實(shí)例
1.基于域名的跳轉(zhuǎn)
現(xiàn)在公司舊域名www.jiu.com有業(yè)務(wù)需求變更,需要使用新域名www.xin.com代替,但是舊域名不能廢除,需要跳轉(zhuǎn)到新域名上,而且后面的參數(shù)保持不變。
第一步:修改主配置文件
vim /usr/local/nginx/conf/nginx.conf server { listen 80; server_name www.jiu.com; #域名修改 charset utf-8; access_log /var/log/nginx/www.jiu.com-access.log; #日志修改 location / { #添加域名重定向 if ($host = 'www.jiu.com'){ #$host為rewrite全局變量,代表請求主機(jī)頭字段或主機(jī)名 rewrite ^/(.*)$ http://www.xin.com/$1 permanent; #$1為正則匹配的內(nèi)容,即域名后邊的字符串 } root html; index index.html index.htm; } }
第二步:創(chuàng)建所需目錄與文件
#創(chuàng)建日志文件夾,檢查語法 mkdir -p /var/log/nginx nginx -t #創(chuàng)建網(wǎng)頁test目錄與文件1.html mkdir -p /usr/local/nginx/html/test vim /usr/local/nginx/html/test/1.html ------------------------------------------ <h1 font color=red> Here is the content of test <img src="1.jpg"/> </h1 ------------------------------------------- #上傳1.jpg圖片文件 cd /usr/local/nginx/html/test rz -E
第三步:添加域名與IP地址映射關(guān)系
第四步:網(wǎng)頁驗(yàn)證
#打開瀏覽器輸入 www.jiu.com/test/1.html 會(huì)發(fā)現(xiàn)重定向到www.xin.com/test/1.html
2.基于客戶端 IP 訪問跳轉(zhuǎn)
公司業(yè)務(wù)新版本上線,要求所有 IP 訪問任何內(nèi)容都顯示一個(gè)固定維護(hù)頁面,只有公司 IP :192.168.79.210訪問正常。
第一步:修改主配置文件
vim /usr/local/nginx/conf/nginx.conf -------------------------------------------------------------- server { listen 80; server_name www.weihu.com; #域名修改 charset utf-8; access_log /var/log/nginx/www.kgc.com-access.log; #日志修改 #設(shè)置是否合法的IP標(biāo)記 set $rewrite true; #設(shè)置變量$rewrite,變量值為boole值true #判斷是否為合法IP if ($remote_addr = "192.168.80.111"){ #當(dāng)客戶端IP為192.168.80.111時(shí),將變量值設(shè)為false,不進(jìn)行重寫 set $rewrite false; } #除了合法IP,其它都是非法IP,進(jìn)行重寫跳轉(zhuǎn)維護(hù)頁面 if ($rewrite = true){ #當(dāng)變量值為true時(shí),進(jìn)行重寫 rewrite (.+) /weihu.html; #重寫在訪問IP后邊插入/weihu.html,例如192.168.80.11/weihu.html } location = /weihu.html { root /var/www/html; #網(wǎng)頁返回/var/www/html/weihu.html的內(nèi)容 } location / { root html; index index.html index.htm; } }
第二步:設(shè)置維護(hù)界面并重啟服務(wù)
mkdir -p /var/www/html/ vim /var/www/html/weihu.html ----------------------------------- <h1> Sorry! We are busy now! See you tomorrow! </h1> ----------------------------------- systemctl restart nginx
第三步:網(wǎng)頁驗(yàn)證
#本機(jī)網(wǎng)頁瀏覽器輸入 www.weihu.com 訪問應(yīng)正常 #在其他設(shè)備瀏覽器訪問測試首先修改映射文件 echo "192.168.80.111 www.weihu.com" >>/etc/hosts #瀏覽器測試 www.weihu.com
3. 基于舊域名跳轉(zhuǎn)到新域名后面加目錄
現(xiàn)在訪問的是 http://mail.jiu.com/post,現(xiàn)在需要將這個(gè)域名下面的訪問都跳轉(zhuǎn)到http://www.jiu.com/
第一步:修改主配置文件
vim /usr/local/nginx/conf/nginx.conf ------------------------------------- server { listen 80; server_name www.jiu.com; #域名修改 charset utf-8; access_log /var/log/nginx/pc03-access.log; #添加 location /post { rewrite (.+) http://www.jiu.com/mail$1 permanent; #這里的$1為位置變量,代表/post } location / { root html; index index.html index.htm; } }
第二步:添加臨時(shí)域名和IP的映射關(guān)系
vim /etc/hosts -------------- 192.168.80.111 www.jiu.com mail.jiu.com
第三步:創(chuàng)建準(zhǔn)備的網(wǎng)頁文件
[root@localhost conf.d]#mkdir -p /apps/nginx/html/post/ [root@localhost conf.d]#echo "this is 1.html" >> /apps/nginx/html/post/1.html [root@localhost conf.d]#systemctl restart nginx
第四步:瀏覽器驗(yàn)證
輸入mail.jiu.com/post/1.html 顯示為www.jiu.com/post/1.html
4.基于參數(shù)匹配的跳轉(zhuǎn)
訪問http://www.jiu.com/100-(100|200)-100.html 跳轉(zhuǎn)到http://www.jiu.com頁面。
第一步:修改主配置文件
vim /usr/local/nginx/conf/nginx.conf -------------------------------------- server { listen 80; server_name www.pc04.com; #域名修改 charset utf-8; access_log /var/log/nginx/www.pc04.com-access.log; if ($request_uri ~ ^/100-(100|200)-(\d+).html$) { rewrite (.*) http://www.pc04.com permanent; } location / { root html; index index.html index.htm; } }
第二步:檢查語法并重啟服務(wù)
nginx -t systemctl restart nginx
第三步:網(wǎng)頁驗(yàn)證
#在瀏覽器輸入 www.pc04.com/100-200-100.html
#在瀏覽器輸入錯(cuò)誤范圍 www.jiu.com/100-500-100.html
5.基于目錄下所有 php 結(jié)尾的文件跳轉(zhuǎn)
要求訪問 http://www.kgc.com/upload/123.php 跳轉(zhuǎn)到首頁。
第一步:修改主配置文件
vim /usr/local/nginx/conf/nginx.conf ------------------------------------ server { listen 80; server_name www.pc05.com; #域名修改 charset utf-8; access_log /var/log/nginx/www.pc05.com-access.log; location ~* /upload/.*\.php$ { rewrite (.+) http://www.pc05.com permanent; } location / { root html; index index.html index.htm; } }
第二步:檢查語法并重啟服務(wù)
nginx -t systemctl restart nginx
第三步:網(wǎng)頁驗(yàn)證
#在瀏覽器輸入 www.pc05.com/upload/123.php
6.基于最普通一條 url 請求的跳轉(zhuǎn)
要求訪問一個(gè)具體的頁面如 http://www.kgc.com/abc/123.html 跳轉(zhuǎn)到首頁
第一步:修改主配置文件
vim /usr/local/nginx/conf/nginx.conf ---------------------------------------- server { listen 80; server_name www.pc06.com; #域名修改 charset utf-8; access_log /var/log/nginx/www.pc06.com-access.log main; location ~* ^/abc/123.html { rewrite (.+) http://www.pc06.com permanent; } location / { root html; index index.html index.htm; } }
第二步:檢查配置文件并且重啟服務(wù)
nginx -t systemctl restart nginx
第三步:瀏覽器中訪問測試
#在瀏覽器輸入 www.pc06.com/abc/123.html
到此這篇關(guān)于Nginx之rewrite重寫的具體使用的文章就介紹到這了,更多相關(guān)Nginx rewrite重寫內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Nginx配置跨域請求Access-Control-Allow-Origin * 詳解
這篇文章主要給大家介紹了關(guān)于Nginx配置跨域請求Access-Control-Allow-Origin * 的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家學(xué)習(xí)或者使用Nginx具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來一起學(xué)習(xí)學(xué)習(xí)吧2019-06-06Nginx中l(wèi)ocation proxy_pass加與不加/的區(qū)別說明
本文總結(jié)了Nginx配置中的location匹配規(guī)則和proxy_pass用法,包括前綴匹配、精確匹配、正則表達(dá)式匹配、通配符匹配以及proxy_pass的配置細(xì)節(jié)2024-12-12深入分析nginx+php-fpm服務(wù)HTTP狀態(tài)碼502
這篇文章主要介紹了深入分析nginx+php-fpm服務(wù)HTTP狀態(tài)碼502,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2019-07-07Nginx緩存Cache的配置方案以及相關(guān)內(nèi)存占用問題解決
這篇文章主要介紹了Nginx緩存Cache的配置方案以及相關(guān)內(nèi)存占用問題解決,Cashe配置最主要的還是需要注意內(nèi)存資源的使用問題,需要的朋友可以參考下2016-01-01