1. 程式人生 > >rewrite語法規則

rewrite語法規則

rewrite規則

格式:rewrite		regex		replaceent	[flag]
1)rewrite配置可以在server 、location以及if配置段內生效
2)regex是用於匹配URI的正則表示式,其不會匹配到$host(域名)
3)replaceemt是目標跳轉的URI,可以以http://或者https://開頭,也可以省略$host,直接寫$request_uri部分(即請求的連結)
4)flag是用來設定rewrite對URI的處理能力,其中有break、 last 、rediect 、permanent,其中break和last在前面已經介紹過。rediect和permanent的區別在於,前者為臨時重定向(302),後者是永久重定向(301),對於使用者通過瀏覽器訪問,這2者的效果是一致的。但是對於搜尋引擎蜘蛛爬蟲來說就有區別了,使用301更有利於SEO。所以建議replacement是以http://或者https://開頭的flag使用permanent。

示例1

location	/	{
		rewrite		/(.*) http://www.test.com/$1 permanent;
}
說明:.*為正則表示式,用()括起來,在後面的URI中可以呼叫它,第一次出現的()用$1呼叫,第二次出現的()用$2呼叫,以此類推

示例2

location	/		{
		rewrite		/.*		http://www.test.com$request_uri		permanent;
}
說明:在replacement中,支援變數,這裡的$request_uri就是客戶端請求的連結

示例3

server{
		listen 80;
		server_name www.123.com;
		root		/tmp/123.com;
		index	index.html;
		rewrite		/(.*)		/abc/$1	redirct;
}
說明:本例中的rewrite規則有問題,會造成連續迴圈,nginx有個最大50次限制,最終會失敗,解決該問題有以下2個方案

方案1 
serve{
		listen 80;
		server_name www.123.com;
		root		/tmp/123.com
		index	index.html;
		rewrite		/(.*)	/abc/$1 break;
}
說明:在rewrite中使用break,會避免迴圈

方案2
server{
		listen 80;
		server_name www.123.com;
		root		/tmp/123.com;
		index	index.html;
		if	($request_uri	!~		'^/abc/')
		{
				rewrite 	/(.*)		/abc/$1	redirect;
		}
}
說明:加一個條件限制,也可以避免產生迴圈