Rewrite規則也稱爲規則重寫,主要功能是實現瀏覽器訪問HTTP URL的跳轉,其正則表達式基於perl語言。重要用途以下php
a、對搜索引擎優化(Search Engine Optimization,SEO)友好,利於搜索引擎抓取網址頁面;html
b、隱藏網址的URL真實地址,瀏覽器顯示更加完美;nginx
c、網站變動升級,能夠基於Rewrite臨時重定向到其餘頁面;正則表達式
Nginx Rewrite 規則使用中有三個概念,分別是:Rewrite結尾標識符、Rewrite規則經常使用表達式、Nginx Rewrite變量,以下爲詳解瀏覽器
(1) Nginx Rewrite 結尾標識符,用於Rewrite規則末尾,標識規則的執行屬性緩存
last :至關於Apache裏的(L)標記,表示完成rewrite匹配; break:本條規則匹配完成後,終止匹配,再也不匹配後面的規則。 redirect:返回302臨時重定向,瀏覽器地址會顯示跳轉後的URL地址。 permanent:返回301永久重定向,瀏覽器地址欄會顯示跳轉後的URL地址。 其中last和break用來實現URL重寫時,瀏覽器地址欄URL地址不變。
(2)Nginx Rewrite 規則經常使用表達式,主要用於匹配參數、字符串及過濾設置。服務器
. 匹配任何單字符; [0-9] 匹配字符串:0-9; [^0-9] 不匹配字符串:0-9; nihao|nisdni 可選擇的字符串; ? 匹配0到1個字符; * 匹配0到多個字符; + 匹配1到多個字符; ^ 字符串開始標誌; $ 字符串結束標誌; \n 轉義標識符;
(3)Nginx Rewrite 變量,經常使用於匹配HTTP請求頭信息、瀏覽器主機名、URL等。iphone
HTTP headers:HTTP_USERHTTP_AGENT,HTTP_REFERRER,HTTP_COOKIE,HTTP_HOST,HTTP_ACCEPT; connection&request:REMOTE_ADDR,QUERY_STRING; server internals:DOCUMENT_ROOT,SERVER_PORT,SERVER_PROTOCOL; system stuff;TIME_YEAR,TIME_MON,TIME_DAY; HTTP_USER_AGENT 用戶使用的代理,例如瀏覽器; HTTP_REFERER 告知服務器,從哪一個頁面來訪問的; HTTP_COOKIE 客戶端緩存,主要用於存儲用戶名和密碼等信息; HTTP_HOST 匹配服務器ServerName域名; HTTP_ACCEPT 客戶端的瀏覽器支持的MIME類型; REMOTE_ADDR 客戶端的IP地址 QUERY_STRING URL中訪問的字符串; DOCUMENT_ROOT 服務器發佈目錄; SERVER_PORT 服務器端口; SERVER_PROTOCOL 服務器端協議; TIME_YEAR 年; TIME_MON 月; TIME_DAY 日
(4) Nginx Rewrite 如下配置均配置在nginx.conf或者vhosts.conf中;優化
1.將hello.net 跳轉至www.hello.net if ( $host='hell.net' ) { rewrite ^/(.*)$ http://www.hello.net/$1 permanent; } 2.訪問www.hello.net 跳轉www.baidu.com/new.index.html. rewrite ^/$ http://www.baidu.com/new.index.html permanent; 3.訪問/hello/test/跳轉至/newindex.html,瀏覽器地址不變。 rewrite ^/hello/test/$ /newindex.html last; 4.多域名跳轉到www.baidu.com. if($host='www.baidu.com'){ rewrite ^/(.*)$ http://www.baidu.com/$1 permanent; } 5.訪問文件和目錄不存在跳轉至index.php if ( !-e $request_filename ) { rewrite ^/(.*)$ /index.php last; } 6.目錄對換/xxx/1234 /xxx?id=1234 rewrite ^/(.+)(\d+) $1?id=$2 last; 7.判斷瀏覽器User Agent跳轉。 if ( $http_user_agent ~ MSIE ) { rewrite ^/(.*)$/ie/$1 break; } 8.禁止訪問以.sh,.flv,.mp3爲文件後綴名的文件。 location ~ .*\.(sh|flv|mp3)$ { return 403; } 9.將移動用戶訪問跳轉至移動端。 if ( $http_user_agent ~* "(Android)|(iphone)|(Mobile)|(WAP)|(UCWEB)") { rewrite ^/$ http://m.baidu.com/ permanent; } 10.匹配URL訪問字符串跳轉。 if ( $args~*tid=13 ) { return 404; } 11.訪問/10690/hello/546 跳轉至/index.php?tid/10690/items=123,[0-9]表示任意一個數字,+表示多個,(.+)表示任意多個字符。 rewrite ^/([0-9]+)/hello/(.+)$ /index.php?tid/$1/items=$2 last;