nginx url重寫

nginx rewrite 實現二級域名跳轉
當訪問http://www.jbyuan.com跳轉到http://www.jbyuan.com/nvxingjiankang/
html

方法一:
這種方法瀏覽器地址會變www.jbyuan.com/nvxingjiankang/
實現訪問以下:
 
nginx

複製代碼 代碼以下:正則表達式

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 ~* "^(.*)\.test\.com$") {
                set $domain $1;
                rewrite ^(.*) http://www.test.com/test/$domain/
break;
        }
}
數據庫

方法2、
當訪問http://www.jbyuan.com跳轉到http://www.jbyuan.com/nvxingjiankang/
 
apache

複製代碼 代碼以下:瀏覽器

server {
        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;
}
dom

rewrite命令
nginx的rewrite至關於
apache的rewriterule(大多數狀況下能夠把原有apache的rewrite規則加上引號就能夠直接使用),它能夠用在server,location 和IF條件判斷塊中,命curl

令格式以下:
rewrite
正則表達式 替換目標 flag標記
flag標記能夠用如下幾種格式:
last - 基本上都用這個Flag。
break - 停止Rewirte,不在繼續匹配
redirect - 返回臨時
重定向的HTTP狀態302
permanent - 返回永久重定向的HTTP狀態301
例以下面這段設定nginx將某個目錄下面的文件重定向到另外一個目錄,$2對應第二個括號(.*)中對應的字符串:
 
測試

複製代碼 代碼以下:網站

location /download/ {
        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在文件和目錄不存在的時候重定向:
 

複製代碼 代碼以下:

if (!-e $request_filename) {
        proxy_pass http://127.0.0.1;
}

return
返回http代碼,例如設置nginx
防盜鏈
 

複製代碼 代碼以下:

location ~* \.(gif|jpg|png|swf|flv)$ {
        valid_referers none blocked www.jefflei.comwww.leizhenfang.com;
        if ($invalid_referer) {
                return 404;
        }
}

記一正則,匹配非某單詞
因爲要rewrite一個地址從
/mag/xx/xxx/ -> /m/xxx
但原先 /mag/xx/more/ 要保留
這就得寫一個比較奇特的正則了,嘗試了比較多的寫法也沒成功

最早想到的是:
 

複製代碼 代碼以下:

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

[]的寫法並不湊效,裏面是匹配單個字符的,這樣無效,匹配不了

仍是小范同窗不錯,研究的深刻,提供了非某單詞的寫法 (?!more)
 

複製代碼 代碼以下:

location ~* ^/mag/[^/]+/(?!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 {
server_name www.jefflei.com jefflei.com ;
if ($host != 'www.jefflei.com' ) {
rewrite ^/(.*)$ http://www.jefflei.com/$1 permanent;
}
...
}
 

第二種方法:
 

複製代碼 代碼以下:

server {
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 PermanentlyServer: nginx/0.7.65Date: Tue, 03 Aug 2010 01:12:37 GMTContent-Type: text/htmlContent-Length: 185Connection: keep-aliveLocation: http://qinfy.net/

相關文章
相關標籤/搜索