4,nginx URL重寫

https://www.cnblogs.com/wloveh/p/4640565.html

nginx rewrite 首先二級(jí)域名跳轉(zhuǎn)
當(dāng)訪問(wèn)http://www..jbyuan.com 跳轉(zhuǎn)到http://www.jbyuan.com/nvxingjiankang/

方法一:
這種方法瀏覽器地址會(huì)變成 www.jbyuan.com/nvxingjiankang/
實(shí)現(xiàn)訪問(wèn)如下:
復(fù)制代碼如下:

server{
  listen 80;
server_name  www.test.com;
location /{
   root  /data/test
   index  index.html;
}
}
server{
  listen 80;
server_name  *.test.com;
if($http_host~*"^(.*)\.com$"){
      set $domain $1;
 rewrie ^(.*)http://www.test.com/test/$domain/break;
}
}
方法二,
當(dāng)訪問(wèn)http://www.jbyuan.com 跳轉(zhuǎn)到http://www.jbyuan.com/nvxinigjiankang/

復(fù)制代碼如下:
server{
  listen 80;
server_name  *.test.com
root  /usr/local/www;
#這里可以添加多個(gè)目錄,如果不添加目錄,會(huì)無(wú)法訪問(wèn)到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  $ddomain $1;

}
rewrite ^/(.*)     /test/$domain/$1 last;

}
access_log off;

}

rewrite命令
nginx的rewrite相當(dāng)于apache的rewriterule(多數(shù)情況下可以把原有的apache的rewrite規(guī)則加上引號(hào)就可以直接使用),他可以用在server,location和if條件判斷中,命令格式如下:
rewrite 正則表達(dá)式替換目標(biāo)flag標(biāo)記
flag可以用以下幾種格式;
last -基本上都用這個(gè)flag.
break -中止Rewrite,不再繼續(xù)匹配
redirect - 返回臨時(shí)重定向的HTTP狀態(tài)302
permanent -返回永久重定向的HTTp狀態(tài)301
例如下面這段設(shè)定nginx 將某個(gè)目錄下面的文件重定向到另外一個(gè)目錄,2對(duì)應(yīng)第二個(gè)括號(hào)(.*)中對(duì)應(yīng)的字符串: 復(fù)制代碼如下: location /download/{ rewrite ^(/download/.*)/m/(.*)\.* 1/nginx-rewrite/2.gz break;

}

nginx重定向的if條件判斷
在server和location倆種情況下可以使用nginx的if條件判斷,條件可以分為以下幾種:
正則表達(dá)式
如:

匹配判斷
~為區(qū)分大小寫匹配; !~為區(qū)分大小寫不匹配
~*為不區(qū)分大小寫匹配;  !~為不區(qū)分大小寫匹配
就是當(dāng)用戶輸入  www.a.com.cn 自動(dòng)跳轉(zhuǎn)到www.a.com這個(gè)域名;
rewrite ^/(.*)$http://www.a.com/$1 permanent; 或者cname

例如下面設(shè)定nginx在用戶使用ie的使用重定向到/nginx-ie目錄下;
if($http_user_agent ~MSIE){
rewirte ^(.*)$ /nginx-ie/$1 break;
}
文件和目錄判斷
-f和 !-f判斷是否存在文件
-d和!-d 判斷是否存在目錄
-e 和 !-e 判斷是否存在文件或目錄
-x 和 !-x判斷文件是否可執(zhí)行

例如下面設(shè)定nginx在文件和目錄不存在的時(shí)候重定向:
復(fù)制代碼代碼如下:
if(!-e $request_filename){
proxy_pass  http://127.0.0.1;
}
return
返回http代碼,例如設(shè)置nginx防盜鏈:

復(fù)制代碼如下:
location ~*\.(gif|jpg|png|swf|flv)${
valid_referers none blocked www.jefflei.comwww.leizhenfang.com;
if($invalid_referer){
return 404;
}
}

記一正則,匹配非某單詞
由于要rewrite一個(gè)地址從
/mag/xx/xxx/->/m/xxx
但是原先/mag/xx/more/要保留
這個(gè)就要寫一個(gè)比較奇特的正則了,嘗試比較多的寫法沒(méi)有成功
最先想到的是:
復(fù)制代碼如下:

location ~*^/mag/[^/]+/[^(more)]+/{
rewirte ^/mag/[^/]+/(.*)/m/$1 permanebt;
}

[]的寫法并沒(méi)有鋪?zhàn)嘈?。里面是匹配的單個(gè)字符的,這樣寫無(wú)效,匹配不了

location ~*/mag/[^/]+/(?!more)([^/]+)/{
  rewrite ^/mag/[^/]+/(.*)/m/$1 permanent;
}

這個(gè)寫法勉強(qiáng)應(yīng)付了,后面的匹配元素雖說(shuō)不完美,但是也能足夠我的所有需求了

常用的分組語(yǔ)法

捕獲
(exp)匹配exp,病捕獲文本到自動(dòng)命名的組里,也可以寫成(?'name'exp)
(exp) 匹配exp,并捕獲文本到自動(dòng)命名的組里
(?exp) 匹配exp,并捕獲文本到名稱為name的組里,也可以寫成(?'name'exp)
(?:exp) 匹配exp,不捕獲匹配的文本,也不給此分組分配組號(hào)
(?=exp)匹配exp前面的位置
(?<=exp)匹配exp后面的位置,
(?!exp)匹配后面跟的不是exp的位置
(?<!exp)匹配前面不是exp的位置

為何要使用301重定向

在網(wǎng)站建設(shè)中需要網(wǎng)頁(yè)重定向的情況很多:如網(wǎng)絡(luò)目錄結(jié)構(gòu)變動(dòng),網(wǎng)頁(yè)重命名,網(wǎng)頁(yè)擴(kuò)展名改變,網(wǎng)站域名改變等。如果不做重定向,用戶的收藏和搜索引擎數(shù)據(jù)庫(kù)中的舊地址只能讓訪客得到一個(gè)錯(cuò)誤的404頁(yè)面,訪問(wèn)流量白白流失。不僅如此,之前該頁(yè)面的一切積累比如pr值就都白費(fèi)了

301重定向不僅能使頁(yè)面實(shí)現(xiàn)自動(dòng)跳轉(zhuǎn),對(duì)于搜索引擎來(lái)說(shuō),也可能傳遞pr值,

nginx重定向規(guī)則詳細(xì)介紹,請(qǐng)參考:http://www.jbxue.com/article/2186.html

301重定向方法
進(jìn)行了301重定向,把www.jefflei.comjefflei.com合并,并把之前的域名也一并合并,有倆種方法實(shí)現(xiàn),第一種方法是判斷nginx核心變量host(老版本是http_host);
復(fù)制代碼如下:
1

server{
#跳轉(zhuǎn)
       listen 80;
 server_name www.jefflei.com.com    jefflei.com;
if($host !='www.jefflei.com'){
   rewrite ^/(.*)$ http://www.jefflei.com/$1 permanent;
}

}

2

server{
#跳轉(zhuǎn)
       listen 80;
   serer_name jefflei.com;
rewrite ^/(.*)http://www.jefflei.com/$1 permanent;
}

3

server{
#跳轉(zhuǎn)
       listen 80;
   serer_name jefflei.com;
rewrite   ^ http://www.jefflei.com$request_uri? permanent;
}

測(cè)試了都是ok,這三種方法中,permanent是關(guān)鍵,詳細(xì)說(shuō)明見(jiàn)nginx重定向規(guī)則說(shuō)明。
last- 基本上都是用了這個(gè)Flag
break - 終止Rewirte,不再繼續(xù)匹配
redirect - 返回臨時(shí)重定向的HTTP狀態(tài)302
permanent - 返回的永久重定向的HTTP狀態(tài)301
好了,現(xiàn)在可以檢查結(jié)果,這里可以看返回的HTTP頭信息:
http://www.seoconsultants.com/tools/headers.asp
第二種方法沒(méi)有測(cè)試成功...

測(cè)試是否定向成功
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

測(cè)試成功~ 重啟nginx~ 輸入指令~
/usr/local/nginx/sbin/nginx -s reload

重啟之后測(cè)試一下~是否成功設(shè)定完成! 輸入指令~
curl -I imcat.tk

會(huì)輸出:
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/

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

友情鏈接更多精彩內(nèi)容