nginx rewrite 實現二級域名跳轉
當訪問http://www.jbyuan.com跳轉到http://www.jbyuan.com/nvxingjiankang/
方法一:
這種方法瀏覽器地址會變www.jbyuan.com/nvxingjiankang/
實現訪問如下:
listen 80;
server_name www.test.com;
location / {
root /data/test;
index index.html;
}
}
server {
listen 80;
server_name *.test.com;
if ( $http_host ~* "^(.*)\.test\.com$") {
set $domain $1;
rewrite ^(.*) http://www.test.com/test/$domain/ break;
}
}
方法二、
當訪問http://www.jbyuan.com跳轉到http://www.jbyuan.com/nvxingjiankang/
listen 80;
server_name *.test.com;
root /usr/local/www;
#這是里可以加多個目錄,如果不加目錄,會無法訪問到http://www.jbyuan.com/nvxingjiankang/目錄下的文件,如圖片目錄/images
location ~ ^/(test|images|styles)/
{
proxy_redirect off;
proxy_set_header Host www.test.com;
proxy_pass http://192.168.1.2:8080;
}
location / {
set $domain default;
if ( $http_host ~* "^(.*)\.test\.com$") {
set $domain $1;
}
rewrite ^/(.*) /test/$domain/$1 last;
}
access_log off;
}
rewrite命令
nginx的rewrite相當於apache的rewriterule(大多數情況下可以把原有apache的rewrite規則加上引號就可以直接使用),它可以用在server,location 和IF條件判斷塊中,命
令格式如下:
rewrite 正則表達式 替換目標 flag標記
flag標記可以用以下幾種格式:
last - 基本上都用這個Flag。
break - 中止Rewirte,不在繼續匹配
redirect - 返回臨時重定向的HTTP狀態302
permanent - 返回永久重定向的HTTP狀態301
例如下面這段設定nginx將某個目錄下面的文件重定向到另一個目錄,$2對應第二個括號(.*)中對應的字符串:
rewrite ^(/download/.*)/m/(.*)\..*$ $1/nginx-rewrite/$2.gz break;
}
nginx重定向的IF條件判斷
在server和location兩種情況下可以使用nginx的IF條件判斷,條件可以為以下幾種:
正則表達式
如:
匹配判斷
~ 為區分大小寫匹配; !~為區分大小寫不匹配
~* 為不區分大小寫匹配;!~為不區分大小寫不匹配
就是當用戶輸入 www.a.com.cn 自動跳轉到www.a.com 這個域名:
rewrite ^/(.*)$ http://www.a.com/$1 permanent; 或者cname
例如下面設定nginx在用戶使用ie的使用重定向到/nginx-ie目錄下:
if ($http_user_agent ~ MSIE) {
rewrite ^(.*)$ /nginx-ie/$1 break;
}
文件和目錄判斷
-f和!-f判斷是否存在文件
-d和!-d判斷是否存在目錄
-e和!-e判斷是否存在文件或目錄
-x和!-x判斷文件是否可執行
例如下面設定nginx在文件和目錄不存在的時候重定向:
proxy_pass http://127.0.0.1;
}
return
返回http代碼,例如設置nginx防盜鏈:
valid_referers none blocked www.jefflei.comwww.leizhenfang.com;
if ($invalid_referer) {
return 404;
}
}
記一正則,匹配非某單詞
由於要rewrite一個地址從
/mag/xx/xxx/ -> /m/xxx
但原先 /mag/xx/more/ 要保留
這就得寫一個比較奇特的正則了,嘗試了比較多的寫法也沒成功
最先想到的是:
rewrite ^/mag/[^/]+/(.*) /m/$1 permanent;
}
[]的寫法並不湊效,里面是匹配單個字符的,這樣無效,匹配不了
還是小范同學不錯,研究的深入,提供了非某單詞的寫法 (?!more)
rewrite ^/mag/[^/]+/(.*) /m/$1 permanent;
}
這個寫法勉強可以應付了,后面的匹配單元雖說還不完美,但也能夠對付我的所有需求內容了。
有需要的可以參考此寫法。
常用分組語法
捕獲
(exp) 匹配exp,並捕獲文本到自動命名的組里
(?exp) 匹配exp,並捕獲文本到名稱為name的組里,也可以寫成(?'name'exp)
(?:exp) 匹配exp,不捕獲匹配的文本,也不給此分組分配組號
(?=exp) 匹配exp前面的位置
(?<=exp) 匹配exp后面的位置
(?!exp) 匹配后面跟的不是exp的位置
(?<!exp) 匹配前面不是exp的位置
為何要使用301重定向
在網站建設中需要網頁重定向的情況很多:如網頁目錄結構變動,網頁重命名、網頁的擴展名改變、網站域名改變等。如果不做重 定向,用戶的收藏和搜索引擎數據庫中的舊地址只能讓訪客得到一個404錯誤信息頁面,訪問流量白白喪失。不僅如此,之前該頁面的一切積累(比如PR值)就 都白費了。
301重定向不僅能使頁面實現自動跳轉,對於搜索引擎來說,也可能可以傳遞PR值。
nginx重定向規則詳細介紹,請參考:http://www.jbxue.com/article/2186.html
301重定向方法
進行了301重定向,把www .jefflei.com和jefflei.com合並,並把之前的域名也一並合並. 有兩種實現方法,第一種方法是判斷nginx核心變量host(老版本是http_host):
server_name www.jefflei.com jefflei.com ;
if ($host != 'www.jefflei.com' ) {
rewrite ^/(.*)$ http://www.jefflei.com/$1 permanent;
}
...
}
第二種方法:
server_name jefflei.com;
rewrite ^/(.*) http://www.jefflei.com/$1 permanent;
}
測試了第一種方法ok,這兩種方法中, permanent是關鍵,詳細說明見nginx重定向規則說明。
last – 基本上都用這個Flag。
break – 中止Rewirte,不在繼續匹配
redirect – 返回臨時重定向的HTTP狀態302
permanent – 返回永久重定向的HTTP狀態301
好了,現在可以檢查結果,這里可以看返回的HTTP頭信息:
http://www.seoconsultants.com/tools/headers.asp
第二種方法沒有測試成功...
測試是否定向成功
http://qinfy.net/301-redirect-for-nginx/
輸入指令~
/usr/local/nginx/sbin/nginx -t
提示:
the configuration file /usr/local/nginx/conf/nginx.conf syntax is ok
configuration file /usr/local/nginx/conf/nginx.conf test is successful
測試成功~ 重啟nginx~ 輸入指令~
/usr/local/nginx/sbin/nginx -s reload
重啟之后測試一下~是否成功設定完成! 輸入指令~
curl -I imcat.tk
會輸出:
HTTP/1.1 301 Moved Permanently
Server: nginx/0.7.65
Date: Tue, 03 Aug 2010 01:12:37 GMT
Content-Type: text/html
Content-Length: 185
Connection: keep-alive
Location: http://qinfy.net/