Apache重寫規則的常見應用及執行個體說明

來源:互聯網
上載者:User

本文旨在提供如何用Apache重寫規則來解決一些常見的URL重寫方法的問題,通過常見的執行個體給使用者一些使用重寫規則的基本方法和線索。

一、為什麼需要用重寫規則

網站的生命在於不斷地進行更新和維護,根據業務發展的需求轉移伺服器進行維護、重新組織目錄結構、變換URL甚至改變到新的網域名稱等情況是經常發生的。為了讓客戶不會因此受到任何影響,最好的方法就是使用Apache Rewrite Rule(重寫規則)。

二、重寫規則的作用範圍

1.使用在Apache主設定檔httpd.conf中。

2.使用在httpd.conf裡定義的虛擬機器主機配置中。

3.使用在基本目錄的跨越設定檔.htaccess中。

三、重寫規則的應用條件

當使用者的Web請求最終被導向到某台Web伺服器的Apache守護進程,Apache根據設定檔判斷該請求是主配置還是虛擬機器主機,再根據使用者在瀏覽器中請求的URL來匹配重寫規則,並且根據實際的請求路徑匹配.htaccess中的重寫規則,最後把請求的內容傳回給使用者。該響應可能有2種。

1.將請求內容外部重新導向(Redirect)到另一個URL

讓瀏覽器再次以新的URL發出請求(R=301或者R=302,臨時的或是永久的重新導向)。

例如,一個網站有正規的URL和別名URL,對別名URL進行重新導向到正規URL,或者網站改換成了新的網域名稱,則把舊的網域名稱重新導向到新的網域名稱。

2.由Apache內部子請求代理產生新的內容送回給客戶[P,L]

這是Apache內部根據重寫後的URL,通過代理模組請求內容並將最終內容送回給客戶,用戶端瀏覽器不必再次請求,瀏覽器中的URL不會被重寫,但實際內容由Apache根據重寫規則後的URL產生。

例如,在公司防火牆上啟動並執行Apache啟動這種代理重寫規則,代理對內部網段上的Web伺服器的請求。

四、重寫規則怎樣工作

我們假定在編譯Apache時已經把mod_rewrite編譯成模組,確信您的httpd.conf中有LoadModule rewrite_module libexec/mod_rewrite.so,並且在Addmodule中有Addmodule mod_rewrite.c,則可以使用重寫規則。

當外部請求到達Apache,Apache調用重寫規則中的定義來重寫由使用者瀏覽器指定請求的URL,最後被重寫的URL如果是重新導向,則送交瀏覽器做再一次請求;如果是代理則把重寫後的URL交給代理模組請求最終的內容(Content),最後把內容送回給瀏覽器。

五、何時使用.htaccess中的重寫規則定義

假如您對網站內容所在的伺服器沒有管理員權限,或者您的網站內容放在ISP的伺服器上託管,無法改寫主設定檔,但是您對Web網站內容所在的目錄有寫入權限,則可以設定自己的.htaccess檔案達到同樣的目的。但您需要確定主設定檔中對您的網站所在的目錄定義了下面的內容,否則您的.htaccess不會工作。

< Directory /usr/local/apache/htdocs/www.abc.com> options indexes followsymLinks  allowoverride all  < /Directory >

六、應用舉例

假定Apache被編譯安裝在主機192.168.1.56的/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”,則任何重寫規則定義將不被應用,該開關的另一用處就是如果為了臨時去掉重寫規則,可以將引擎開關設為“off”再重新啟動Apache即可,不必將其中的各條重寫規則注釋掉。

“rewritebase /”的作用是如果在下面的rewriterule定義中被重寫後的部分(此處為檔案名稱index.html.en)前面沒有“/”,則表明是相對目錄,相對於這個rewritebase後面的定義也就是/usr/local/apache/htdocs/index.html.en,否則,如果此處沒有“rewritebase /”這一項,則被重寫成http://192.168.1.56/usr/local/apache/htdocs/manual/index.html.en,顯然是不正確的。

我們也可以不用“rewritebase /”,而是將其改為如下部分。

rewriteengine on rewriterule ^(.*)$ /index.html.en [R=301]

或者更改為:

rewriteengine on  rewriterule ^(.*)$ http://192.168.1.56/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目錄重新導向到使用者jephe自己的主目錄。

rewriteengine on  rewritebase /~jephe/ rewriterule ^(.*)$ $1 [R=301]

這樣,對manual目錄下任何檔案的請求被重新導向到~jephe目錄下相同檔案的請求。

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”表明是條件重寫規則,當滿足後面定義的條件後才會應用下面的重寫規則,“rewritecond”有各種變數,請查閱相關文檔。

3.防火牆上的重寫規則代理內部網段上伺服器的請求

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,表示沒有調試資訊。

sitemap的文法是${sitemap: LookupKey | Defaultvalue},有些書上把$寫成了%是錯誤的。



相關文章

E-Commerce Solutions

Leverage the same tools powering the Alibaba Ecosystem

Learn more >

Apsara Conference 2019

The Rise of Data Intelligence, September 25th - 27th, Hangzhou, China

Learn more >

Alibaba Cloud Free Trial

Learn and experience the power of Alibaba Cloud with a free trial worth $300-1200 USD

Learn more >

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。