Apache Rewrite

Rewirte主要的功能就是實現URL的跳轉,它的正則表達式是基於Perl語言。可基於服務器級的(httpd.conf)和目錄級的 (.htaccess)兩種方式。若是要想用到rewrite模塊,必須先安裝或加載rewrite模塊。方法有兩種一種是編譯apache的時候就直接 安裝rewrite模塊,別一種是編譯apache時以DSO模式安裝apache,而後再利用源碼和apxs來安裝rewrite模塊。html

基於服務器級的(httpd.conf)有兩種方法,一種是在httpd.conf的全局下 直接利用RewriteEngine on來打開rewrite功能;另外一種是在局部裏利用RewriteEngine on來打開rewrite功能,下面將會舉例說明,須要注意的是,必須在每一個virtualhost裏用RewriteEngine on來打開rewrite功能。不然virtualhost裏沒有RewriteEngine on它裏面的規則也不會生效。正則表達式

基於目錄級的(.htaccess),要注意一點那就是必須打開此目錄的FollowSymLinks屬性且在.htaccess裏要聲明RewriteEngine on。express

RewriteCond重寫規則的條件apache

 

RewriteCond指令定義一條規則條件。在一條RewriteRule指令前面可能會有一條或多條RewriteCond指令,只有當自身的模板(pattern)匹配成功且這些條件也知足時規則才被應用於當前URL處理。  TestString是一個字符串,除了包含普通的字符外,還能夠包括下列的可擴展結構:瀏覽器

1.       $N,RewriteRule後向引用,其中(0 <= N <= 9)  $N引用緊跟在RewriteCond後面的RewriteRule中模板中的括號中的模板在當前URL中匹配的數據。
2.       %N,RewriteCond後向引用,其中(0 <= N <= 9)  %N引用最後一個RewriteCond的模板中的括號中的模板在當前URL中匹配的數據。
3.       ${mapname:key|default},RewriteMap擴展.具體參見RewriteMap
4.       %{ NAME_OF_VARIABLE } ,服務器變量。變量的名字以下表(分類顯示)
HTTP headers:
connection & request:
server internals:
system stuff:
HTTP_USER_AGENT
REMOTE_ADDR
DOCUMENT_ROOT
TIME_YEAR
HTTP_REFERER
REMOTE_HOST
SERVER_ADMIN
TIME_MON
HTTP_COOKIE
REMOTE_USER
SERVER_NAME
TIME_DAY
HTTP_FORWARDED
REMOTE_IDENT
SERVER_ADDR
TIME_HOUR
HTTP_HOST
REQUEST_METHOD
SERVER_PORT
TIME_MIN
HTTP_PROXY_CONNECTION
SCRIPT_FILENAME
SERVER_PROTOCOL
TIME_SEC
HTTP_ACCEPT
PATH_INFO
SERVER_SOFTWARE
TIME_WDAY
 
QUERY_STRING
 
TIME
 
AUTH_TYPE
 
 
5.        
specials:
說明
API_VERSION
Apache與模塊間的接口的版本號
THE_REQUEST
客戶端發送到來的HTTP請求行的整行信息,不含其它的頭字段信息,如("GET /index.html HTTP/1.1")
REQUEST_URI
HTTP請求行中請求的資源
REQUEST_FILENAME
請求中對應的服務器本地文件系統中全路徑文件名
IS_SUBREQ
根據是否爲SubRequest,分別值爲」true」」false」
6.       特別說明:
o        SCRIPT_FILENAMEREQUEST_FILENAME變量含有相同的值,也就是Apache服務器內部數據結構request_recfilename字段的值。第一個變量是一個CGI變量,而第二個則與REQUEST_URI(含有request_rec數據結構中uri字段的值)保持一致。
o        %{ENV:variable}中的variable能夠是任何環境變量的名字。對其值的查找,先經過Apache內部的數據結構,(如找不到)再在Apache服務器進程中經過getenv()查找。
o        %{HTTP:header}中的header能夠是任何HTTP MIME-header的名字,其值經過查找HTTP請求信息而得。
o        %{LA-U:variable} 用來引用後續API階段中定義的、當前還不知道的值,具體實現是經過執行一個基於URL的內部的sub-request來決定的variable的最終的值。例如,假如你想在服務器範圍內利用REMOTE_USER的值來完成重寫,但這個值是在驗證階段設置的,而驗證階段是在URL轉換階段的後面。從另外一方面講,因爲mod_rewrite在修補(fixup)API階段進行目錄範圍的重寫,而修補階段在驗證階段的後面,因此此時只要用%{REMOTE_USER}就能夠取得該值了。
o        %{LA-F:variable},執行一個基於文件名字(filename)的內部sub-request來決定variable的最終的值。大多數時間內,這和LA-U相同。
 
  CondPattern是一個條件模板,也就是說,是一個擴展正則式(extended regular expression),用與跟TestString進行匹配。做爲一個標準的擴展正則式,CondPattern有如下補充:
1.       能夠在模板串前增長一個!前綴,以用表示不匹配模板。但並非全部的test均可以加!前綴。
2.       CondPattern中可使用如下特殊變量:
o        '<CONDPATTERN' (小於,基於字母順序)condPattern看成一個普通字符串,將它和TestString進行比較,當TestString 的字符小於CondPattern爲真.
o        '>CondPattern' (大於)condPattern看成一個普通字符串,將它和TestString進行比較,當TestString 的字符大於CondPattern爲真.
o        '=CondPattern' (等於)condPattern看成一個普通字符串,將它和TestString進行比較,當TestString CondPattern徹底相同時爲真.若是CondPattern只是  "" (兩個引號緊挨在一塊兒) 此時需TestString 爲空字符串方爲真.
o        '-d' (是否爲目錄)testString看成一個目錄名,檢查它是否存在以及是不是一個目錄.
o        '-f' (是不是regular file)testString看成一個文件名,檢查它是否存在以及是不是一個regular文件.
o        '-s' (是否爲長度不爲0regular文件)testString看成一個文件名,檢查它是否存在以及是不是一個長度大於0regular文件
o        '-l' (是否爲symbolic link)testString看成一個文件名,檢查它是否存在以及是不是一個  symbolic link.
o        '-F' (經過subrequest來檢查某文件是否可訪問)檢查TestString是不是一個合法的文件,並且經過服務器範圍內的當前設置的訪問控制進行訪問。這個檢查是經過一個內部subrequest完成的, 所以須要當心使用這個功能以下降服務器的性能。
o        '-U' (經過subrequest來檢查某個URL是否存在)檢查TestString是不是一個合法的URL,並且經過服務器範圍內的當前設置的訪問控制進行訪問。這個檢查是經過一個內部subrequest完成的, 所以須要當心使用這個功能以下降服務器的性能。
  [flags]是第三個參數,多個標誌之間用逗號分隔。
1.       'nocase|NC' (不區分大小寫)  在擴展後的TestStringCondPattern中,比較時不區分文本的大小寫。注意,這個標誌對文件系統和subrequest檢查沒有影響.
2.       'ornext|OR' (創建與下一個條件的或的關係)  默認的狀況下,二個條件之間是AND的關係,用這個標誌將關係改成OR。例如:  RewriteCond %{REMOTE_HOST} ^host1.* [OR]RewriteCond %{REMOTE_HOST} ^host2.* [OR]RewriteCond %{REMOTE_HOST} ^host3.*RewriteRule ...若是沒有[OR]標誌,須要寫三個條件/規則.
例子:根據客戶端瀏覽器的不一樣,返回不一樣的首頁面。RewriteCond %{HTTP_USER_AGENT} ^Mozilla.*RewriteRule ^/$ /homepage.max.html [L]RewriteCond %{HTTP_USER_AGENT} ^Lynx.*RewriteRule ^/$ /homepage.min.html [L]RewriteRule ^/$ /homepage.std.html [L]

當你在地址欄裏輸入 sina.com.cn  google.cn服務器

看看有什麼變化?是否是會自動跳轉到 www.sina.com.cn   www.google.cn數據結構

這一技術經過apache的rewrite能夠實現,固然你得把 不帶www的域名指向你服務器的IPdom

 要是虛擬主機的話,得在viralhost段加入 ServerAlias xxx.com性能

而後打開重寫引擎功能google

 RewriteEngine On

能過rewritecond判斷主機名是否帶www

RewriteCond %{HTTP_HOST}  ^xxx/.com$ [NC]

而後來一條

RewriteRule ^/(.*)$  http://www.xxx.com/$1 [R=301,L]

OK,重起apache,如今在瀏覽器中輸入 xxx.com 看看是否是自動變成了www.xxx.com了呢。

從新整理一下就是:

RewriteEngine On

RewriteCond %{HTTP_HOST} ^xxx/.com$ [NC]

RewriteRule ^/(.*)$  http://www.xxx.com/$1 [R=301,L]

 

用.htaccess文件的話:

 

RewriteEngine on RewriteCond %{HTTP_HOST}  ^mydomain.com [NC] RewriteRule ^(.*)$ http://www.mydomain.com/$1 [L,R=301]
 
轉載:http://blog.csdn.net/keyunq/article/details/2536875
相關文章
相關標籤/搜索