Nginx的重寫Rewrite使用示例分析
一、Nginx Rewrite概述
Nginx Rewrite是Nginx服務(wù)器提供的一個(gè)重要基本功能,主要用于實(shí)現(xiàn)URL的重寫和重定向。
Nginx Rewrite的作用:
- URL地址規(guī)范化:通過重寫URL,使其看起來更規(guī)范,更符合開發(fā)及產(chǎn)品人員的需求。
- 搜索引擎優(yōu)化(SEO):將動(dòng)態(tài)URL地址偽裝成靜態(tài)地址提供服務(wù),有助于搜索引擎更好地收錄網(wǎng)站內(nèi)容,提升用戶體驗(yàn)。
- 域名跳轉(zhuǎn):在網(wǎng)站更換新域名后,通過Nginx Rewrite實(shí)現(xiàn)舊域名的訪問跳轉(zhuǎn)到新域名上,確保用戶能夠順利訪問網(wǎng)站。
- 基于特定條件的URL調(diào)整:根據(jù)特殊變量、目錄、客戶端的信息等條件進(jìn)行URL調(diào)整,以滿足不同的訪問需求。
二、常用的Nginx正則表達(dá)式
| 常用正則表達(dá)式 | 解釋 |
|---|---|
| ^ | 匹配輸入字符串的起始位置 |
| $ | 匹配輸入字符串的結(jié)束位置 |
| * | 匹配前面的字符零次或多次 |
| + | 匹配前面的字符一次或多次 |
| ? | 匹配前面的字符零次或一次 |
| . | 匹配除“\n”之外的任何單個(gè)字符 |
| \ | 將后面接著的字符標(biāo)記為一個(gè)特殊字符或一個(gè)原義字符或一個(gè)向后引用 |
| \d | 匹配純數(shù)字[0-9] |
| \D | 匹配非數(shù)字 |
| \s | 匹配空白符 |
| \S | 匹配非空白符 |
| \w | 任意單詞字符包括下劃線[A-Za-z0-9_] |
| \W | 匹配非單詞 |
| {n} | 匹配前一個(gè)字符重復(fù) n 次 |
| {n,} | 匹配前一個(gè)字符重復(fù) n 次或更多次 |
| {n,m} | 匹配前一個(gè)字符重復(fù) n 到 m 次 |
| [] | 定義匹配的字符范圍 |
| () | 表達(dá)式的開始和結(jié)束位置 |
| | | 邏輯或運(yùn)算符 |
三、Rewrite規(guī)則
1.Rewrite跳轉(zhuǎn)實(shí)現(xiàn)
- Nginx:通過ngx_http_rewrite_module 模塊支持URL重寫、支持if條件判斷,但不支持else
- 跳轉(zhuǎn):從一個(gè) location跳轉(zhuǎn)到另一個(gè)location,循環(huán)最多可以執(zhí)行10次,超過后nginx將返回500錯(cuò)誤
- PCRE支持:perl兼容正則表達(dá)式的語法規(guī)則匹配
- 重寫模塊 set 指令:創(chuàng)建新的變量并設(shè)其值
2.Rewrite執(zhí)行順序
- 執(zhí)行 server 塊里面的 rewrite 指令。
- 執(zhí)行 location 匹配。
- 執(zhí)行選定的 location 中的 rewrite 指令。
3.Rewrite語法格式
語法格式:
rewrite <regex> <replacement> [flag];
- regex :表示正則匹配規(guī)則。
- replacement :表示跳轉(zhuǎn)后的內(nèi)容。
- flag :表示 rewrite 支持的 flag 標(biāo)記。
Flag標(biāo)記說明:
- last :本條規(guī)則匹配完成后,不終止重寫后的url匹配,一般用在 server 和 if 中。
- break :本條規(guī)則匹配完成即終止,終止重寫后的url匹配,一般使用在 location 中。
- redirect :返回302臨時(shí)重定向,瀏覽器地址會(huì)顯示跳轉(zhuǎn)后的URL地址。
- permanent :返回301永久重定向,瀏覽器地址欄會(huì)顯示跳轉(zhuǎn)后的URL地址。
四、Rewrite應(yīng)用示例
1.基于域名的跳轉(zhuǎn)
現(xiàn)在公司舊域名www.xxxxxx01.com有業(yè)務(wù)需求變更,需要使用新域名www.xxxxxx02.com代替,但是舊域名不能廢除,需要跳轉(zhuǎn)到新域名上,而且后面的參數(shù)保持不變。
server {
listen 80;
server_name www.bi01.com; #域名修改
charset utf-8;
access_log /var/log/nginx/www.xxxxxx01.com-access.log; #日志修改
location / {
#添加域名重定向
if ($host = 'www.bi01.com'){ #$host為rewrite全局變量,代表請(qǐng)求主機(jī)頭字段或主機(jī)名
rewrite ^/(.*)$ http://www.xxxxxx02.com/$1 permanent; #$1為正則匹配的內(nèi)容,即“域名/”之后的字符串
}
root html;
index index.html index.htm;
}
}2.基于客戶端IP訪問跳轉(zhuǎn)
今天公司業(yè)務(wù)新版本上線,要求所有 IP 訪問任何內(nèi)容都顯示一個(gè)固定維護(hù)頁面,只有公司 IP :192.168.80.10訪問正常。
server {
listen 80;
server_name www.xxxxxx01.com; #域名修改
charset utf-8;
access_log /var/log/nginx/www.xxxxxx01.com-access.log; #日志修改
location / {
#添加域名重定向
if ($host = 'www.bi01.com'){ #$host為rewrite全局變量,代表請(qǐng)求主機(jī)頭字段或主機(jī)名
rewrite ^/(.*)$ http://www.xxxxxx02.com/$1 permanent; #$1為正則匹配的內(nèi)容,即“域名/”之后的字符串
}
root html;
index index.html index.htm;
}
}如果rewrite (.+) /weihu.html; 換成rewrite (.+) /weihu.html permanent; 的話,若不是 192.168.80.10 的主機(jī)訪問會(huì)使瀏覽器修改請(qǐng)求訪問的 URL 成 http://www.bi01.com/weihu.html 再請(qǐng)求訪問,這樣就會(huì)進(jìn)入一直在 rewrite 的死循環(huán),訪問請(qǐng)求會(huì)一直被重寫成http://www.bi01.com/weihu.html 再請(qǐng)求訪問
3.基于舊域名跳轉(zhuǎn)到新域名后追加目錄
現(xiàn)在訪問的是 http://bbs.xxxxxx01.com/post/,現(xiàn)在需要將這個(gè)域名下面的訪問都跳轉(zhuǎn)到http://www.xxxxxx01.com/bbs/post/
server {
listen 80;
server_name bbs.xxxxxx101.com www.xxxxxx01.com;
charset utf-8;
access_log /var/log/nginx/www.xxxxxx01.com-access.log;
#添加
location /post {
rewrite (.+)$ http://www.xxxxxx01.com/bbs$1 permanent; #這里的$1為位置變量,代表/post
}
location / {
root html;
index index.html index.htm;
}
}4.基于參數(shù)匹配的跳轉(zhuǎn)
現(xiàn)在訪問http://www.xxxxxx01.com/100-(100|200)-100.html 跳轉(zhuǎn)到http://www.xxxxxx01.com頁面。
server {
listen 80;
server_name www.xxxxxx01.com;
charset utf-8;
access_log /var/log/nginx/www.xxxxxx01.com-access.log;
if ($request_uri ~ ^/100-(100|200)-(\d+).html$) {
rewrite (.+) http://www.xxxxxx01.com permanent;
}
location / {
root html;
index index.html index.htm;
}
}- $request_uri:包含請(qǐng)求參數(shù)的原始URI,不包含主機(jī)名,如:http://www.xxxxxx101.com/abc/bbs/index.html?a=1&b=2 中的 /abc/bbs/index.php?a=1&b=2
- $uri:這個(gè)變量指當(dāng)前的請(qǐng)求URI,不包括任何參數(shù),如:/abc/bbs/index.html
- $document_uri:與$uri相同,這個(gè)變量指當(dāng)前的請(qǐng)求URI,不包括任何傳遞參數(shù),如:/abc/bbs/index.html
到此這篇關(guān)于Nginx的重寫Rewrite使用示例分析的文章就介紹到這了,更多相關(guān)Nginx Rewrite內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Nginx配置實(shí)現(xiàn)高效精準(zhǔn)的流量限制策略詳解
限流(Rate?Limitting)是服務(wù)降級(jí)的一種方式,通過限制系統(tǒng)的輸入和輸出流量以達(dá)到保護(hù)系統(tǒng)的目的,下面我們就來看看如何通過配置Nginx實(shí)現(xiàn)高效精準(zhǔn)的流量限制策略吧2024-02-02
nginx全局塊的user指令的實(shí)現(xiàn)示例
user用于配置運(yùn)行Nginx服務(wù)器的worker進(jìn)程的用戶和用戶組,本文主要介紹了nginx全局塊的user指令的實(shí)現(xiàn)示例,具有一定的參考價(jià)值,感興趣的可以了解一下2024-07-07

