本文鏈接: http://www.php-oa.com/2008/03/12/apacheurlrewritemod_rewrite.html
一、爲什麼需要用Apache Url Rewrite(mod_rewrite)
網站的生命在於不斷地進行更新和維護,根據業務發展的需求轉移服務器進行維護、重新組織目錄結構、變換URL甚至改變到新的域名等情況是經常發生的。爲了 讓客戶不會因此受到任何影響,最好的方法就是使用Apache Rewrite Rule(Apache Url Rewrite)。
二、Apache Url Rewrite的作用範圍
1.使用在Apache主配置文件httpd.conf中。
2.使用在httpd.conf裏定義的虛擬主機配置中。
3.使用在基本目錄的跨越配置文件.htaccess中。
三、Apache Url Rewrite的應用條件
當用戶的Web請求最終被導向到某臺Web服務器的Apache守護進程,Apache根據配置文件判斷該請求是主配置還是虛擬主機,再根據用戶 在瀏覽器中請求的URL來匹配Apache Url Rewrite,並且根據實際的請求路徑匹配.htaccess中的Apache Url Rewrite,最後把請求的內容傳回給用戶。該響應可能有2種。
1.將請求內容外部重定向(Redirect)到另一個URL
讓瀏覽器再次以新的URL發出請求(R=301或者R=302,臨時的或是永久的重定向)。
例如,一個網站有正規的URL和別名URL,對別名URL進行重定向到正規URL,或者網站改換成了新的域名,則把舊的域名重定向到新的域名。
2.由Apache內部子請求代理產生新的內容送回給客戶
這是Apache內部根據重寫後的URL,通過代理模塊請求內容並將最終內容送回給客戶,客戶端瀏覽器不必再次請求,瀏覽器中的URL不會被重寫,但實際內容由Apache根據Apache Url Rewrite後的URL生成。
例如,在公司防火牆上運行的Apache啓動這種代理Apache Url Rewrite,代理對內部網段上的Web服務器的請求。
四、Apache Url Rewrite怎樣工作
我們假定在編譯Apache時已經把mod_rewrite編譯成模塊,確信您的httpd.conf中有LoadModule rewrite_module libexec/mod_rewrite.so,並且在Addmodule中有Addmodule mod_rewrite.c,則可以使用Apache Url Rewrite。
當外部請求到達Apache,Apache調用Apache Url Rewrite中的定義來重寫由用戶瀏覽器指定請求的URL,最後被重寫的URL如果是重定向,則送交瀏覽器做再一次請求;如果是代理則把重寫後的URL 交給代理模塊請求最終的內容(Content),最後把內容送回給瀏覽器。
五、何時使用.htaccess中的Apache Url Rewrite定義
假如您對網站內容所在的服務器沒有管理員權限,或者您的網站內容放在ISP的服務器上託管,無法改寫配置文件,但是您對Web站點內容所在的目錄 有寫權限,則可以設置自己的.htaccess文件達到同樣的目的。但您需要確定主配置文件中對您的網站所在的目錄定義了下面的內容,否則您 的.htaccess不會工作。
< Directory /usr/local/apache/htdocs/www.abc.com> options indexes followsymLinks
allowoverride all
< /Directory >
六、應用舉例
假定Apache被編譯安裝在主機192.168.1.xx的/usr/local/apache目錄下面,同時編譯了重寫和代理模塊。
1.隱藏Apache下的某個目錄,使得對該目錄的任何請求都重定向到另一個文件
(1)httpd.conf的實現方法
我們將下面的部分放到/usr/local/apache/conf/httpd.conf中。
< Directory “/usr/local/apache/htdocs/manual/”>
options Indexes followsymlinks
allowoverride all
rewriteengine on
rewritebase /
rewriterule ^(.*)$ index.html.en [R=301]
< /Directory >
注: “rewriteengine on”爲重寫引擎開關,如果設爲“off”,則任何Apache Url Rewrite定義將不被應用,該開關的另一用處就是如果爲了臨時去掉Apache Url Rewrite,可以將引擎開關設爲“off”再重新啓動Apache即可,不必將其中的各條Apache Url Rewrite註釋掉。
“rewritebase /”的作用是如果在下面的rewriterule定義中被重寫後的部分(此處爲文件名
index.html.en)前面沒有“/”,則表明是相對目錄,相對於這個rewritebase後面的定義也就是/usr/local/apache
/htdocs/index.html.en,否則,如果此處沒有“rewritebase
/”這一項,則被重寫成http://192.168.1.xx/usr/local/apache/htdocs/manual
/index.html.en,顯然是不正確的。
我們也可以不用“rewritebase /”,而是將其改爲如下部分。
rewriteengine on
rewriterule ^(.*)$ /index.html.en [R=301]
或者更改爲:
rewriteengine on
rewriterule ^(.*)$ http://192.168.1.xx/index.html.en [R=301]
(2).htaccess的實現方法
我們將下面的部分放到httpd.conf中。
< Directory “/usr/local/apache/htdocs/manual/”>
options Indexes followsymlinks
allowoverride all
< /Directory >
然後將下面的部分放到/usr/local/apache/htdocs/manual/.htaccess中。
rewriteengine on
rewritebase /
rewriterule ^(.*)$ index.html.en [R=301]
注: 對文件.htaccess所做的任何改動不需要重啓動Apache。
您還可以利用.htaccess方案將這個manual目錄重定向到用戶phpoa自己的主目錄。
rewriteengine on
rewritebase /~phpoa/
rewriterule ^(.*)$ $1 [R=301]
這樣,對manual目錄下任何文件的請求被重定向到~phpoa目錄下相同文件的請求。
2.將http://www.username.domain.com對於username的主頁請求轉換爲對http://
www.domain.com/username的請求
對於HTTP/1.1的請求包括一個Host: HTTP頭,我們能用下面的規則集重寫http://
www.username.domain .com/anypath到/home/username/anypath。
rewriteengine on
rewritecond %{HTTP_HOST} ^www.[^.] .host.com$
rewriterule ^(. ) %{HTTP_HOST}$1 [C]
rewriterule ^www.([^.] ).host.com(.*) /home/$1$2
注: “rewritecond”表明是條件Apache Url Rewrite,當滿足後面定義的條件後纔會應用下面的重寫規
則,“rewritecond”有各種變量,請查閱相關文檔。
3.防火牆上的Apache Url Rewrite代理內部網段上服務器的請求
NameVirtualhost 1.2.3.4
< Virtualhost 1.2.3.4:80 > servername www.domain.com
rewriteengine on
proxyrequest on
rewriterule ^/(.*)$ http://192.168.1.3/$1 [P,L]
< /Virtualhost >
注: 當外部瀏覽器請求http://www.domain.com時,將被解析到IP地址1.2.3.4,Apache交由mod_rewrite處理,轉換 成http://192.168.1.3/$1後再交由代理模塊mod_proxy,得到內容後傳送回用戶的瀏覽器。
4.基本預先設定的轉換Map表進行重寫rewritemap
轉換http://www.domain.com/{countrycode}/anypath到Map表中規定的URL,前面是虛擬主機中的定義。
rewritelog /usr/local/apache/logs/rewrite.log
rewriteloglevel 9
rewriteengine on
proxyrequest on
rewritemap sitemap txt:/usr/local/apache/conf/rewrite.map
rewriterule ^/([^/] ) /(.*)$ http://%{REMOTE_HOST}::$1 [C]
rewriterule (.*)::([a-z] )$ ${sitemap:$2|http://h.i.j.k/} [R=301,L]
文件/usr/local/apache/conf/rewrite.map的內容如下:
sg http://a.b.c.d/
sh http://e.f.g.h/
注: 當用戶請求http://www.domain.com/sg/anypath時被重寫爲http://a.b.c.d/anypath。當需要調試時請 用rewritelog和 rewriteloglevel 9聯合,9爲最大,即得到最多的調試信息;最小爲1,表示得到最少的調試信息;默認爲0,表示沒有調試信息。