訪問重寫rewrite是Nginx HTTP請求處理過程中的一個重要功能,它是以模塊的形式存在於代碼中的,其功能是對用戶請求的URI進行PCRE正則重寫,然后返回30×重定向跳轉或按條件執行相關配置。rewrite模塊內置了類似腳本語言的set、if、break、return配置指令,通過這些指令,用戶可以在HTTP請求處理過程中對URI進行更靈活的操作控制。rewrite模塊提供的指令可以分兩類,一類是標准配置指令,這部分指令只是對指定的操作進行相應的操作控制;另一類是腳本指令,這部分指令可以在HTTP指令域內以類似腳本編程的形式進行編寫。
和apache等web服務軟件一樣,rewrite的組要功能是實現RUL地址的重定向。Nginx的rewrite功能需要PCRE軟件的支持,即通過perl兼容正則表達式語句進行規則匹配的。默認參數編譯nginx就會支持rewrite的模塊,但是也必須要PCRE的支持
rewrite是實現URL重寫的關鍵指令,根據regex(正則表達式)部分內容,重定向到replacement,結尾是flag標記。
rewrite語法格式及參數語法說明如下:
rewrite <regex> <replacement> [flag]; 關鍵字 正則 替代內容 flag標記 關鍵字:其中關鍵字error_log不能改變 正則:perl兼容正則表達式語句進行規則匹配 替代內容:將正則匹配的內容替換成replacement flag標記:rewrite支持的flag標記 flag標記說明: last #本條規則匹配完成后,繼續向下匹配新的location URI規則,相當於隱藏該條url
break #本條規則匹配完成即終止,不再匹配后面的任何規則,網址不變 redirect #返回302臨時重定向,瀏覽器地址會顯示跳轉后的URL地址 permanent #返回301永久重定向,瀏覽器地址欄會顯示跳轉后的URL地址
rewrite參數的標簽段位置:
server,location,if
例子:
rewrite ^/(.*) http://www.zyiz.net/$1 permanent;
說明:
rewrite為固定關鍵字,表示開始進行rewrite匹配規則
regex部分是 ^/(.*) ,這是一個正則表達式,匹配完整的域名和后面的路徑地址
replacement部分是http://www.zyiz.net/$1 $1,是取自regex部分()里的內容。匹配成功后跳轉到的URL。
flag部分 permanent表示永久301重定向標記,即跳轉到新的 http://www.zyiz.net/$1 地址上
regex 常用正則表達式說明
字符 |
描述 |
\ |
將后面接着的字符標記為一個特殊字符或一個原義字符或一個向后引用。如“\n”匹配一個換行符,而“\$”則匹配“$” |
^ |
匹配輸入字符串的起始位置 |
$ |
匹配輸入字符串的結束位置 |
* |
匹配前面的字符零次或多次。如“ol*”能匹配“o”及“ol”、“oll” |
+ |
匹配前面的字符一次或多次。如“ol+”能匹配“ol”及“oll”、“oll”,但不能匹配“o” |
? |
匹配前面的字符零次或一次,例如“do(es)?”能匹配“do”或者“does”,"?"等效於"{0,1}" |
. |
匹配除“\n”之外的任何單個字符,若要匹配包括“\n”在內的任意字符,請使用諸如“[.\n]”之類的模式。 |
(pattern) |
匹配括號內pattern並可以在后面獲取對應的匹配,常用$0...$9屬性獲取小括號中的匹配內容,要匹配圓括號字符需要\(Content\) |
rewrite 企業應用場景
Nginx的rewrite功能在企業里應用非常廣泛:
u 可以調整用戶瀏覽的URL,看起來更規范,合乎開發及產品人員的需求。
u 為了讓搜索引擎搜錄網站內容及用戶體驗更好,企業會將動態URL地址偽裝成靜態地址提供服務。
u 網址換新域名后,讓舊的訪問跳轉到新的域名上。例如,訪問京東的360buy.com會跳轉到jd.com
u 根據特殊變量、目錄、客戶端的信息進行URL調整等
Nginx配置rewrite過程介紹
(1)創建rewrite語句
server {
listen 80;
server_name www.lipu.com;
location / {
# expires 20h;
# root /root/mywork/;
index index.html;
proxy_pass http://www.zyiz.net;
}
#只要訪問 http://www.zyiz.net/tech/xxxxxxxx (x表示任意字符),則自動跳轉到 http://www.zyiz.net/tutorial.html ,網址不變
location ^~ /tech/ {
rewrite .* /tutorial.html;
}
location /tutorial/
{
#將下划線變成中划線,跳轉,網址不變
rewrite ^/tutorial/list_(.*) //tutorial/list-$1;
}
}
或者
server { listen 80; server_name abc.com www.abc.com; if ( $host != 'www.abc.com' ) { rewrite ^/(.*) http://www.abc.com/$1 permanent; } location / { root /data/www/www; index index.html index.htm; } error_log logs/error_www.abc.com.log error; access_log logs/access_www.abc.com.log main; }
(2)重啟服務
確認無誤便可重啟,操作如下:
nginx -t
#結果顯示ok和success沒問題便可重啟
nginx -s reload
(3)查看跳轉效果
打開瀏覽器訪問abc.com
頁面打開后,URL地址欄的abc.com變成了www.abc.com說明URL重寫成功。
注意事項:
1、跳轉后的地址,也就是重寫后的地址,一定要是真實存在的地址;而之前的地址是虛擬的地址。