IT貓撲網(wǎng):您身邊最放心的安全下載站! 最新更新|軟件分類|軟件專題|手機(jī)版|論壇轉(zhuǎn)貼|軟件發(fā)布

您當(dāng)前所在位置:首頁服務(wù)器WEB服務(wù)器 → Apache 重寫規(guī)則的常見應(yīng)用(rewrite)

Apache 重寫規(guī)則的常見應(yīng)用(rewrite)

時間:2015/6/28來源:IT貓撲網(wǎng)作者:網(wǎng)管聯(lián)盟我要評論(0)

一:目的

本文旨在提供如何用Apache重寫規(guī)則來解決一些常見的URL重寫方法的問題,通過常見的實(shí)例給用戶一些使用重寫規(guī)則的基本方法和線索。

二:為什么需要用重寫規(guī)則?

一個網(wǎng)站,如果是長期需要放在internet上提供服務(wù),必定會有不斷地更新和維護(hù),如臨時轉(zhuǎn)移到其它服務(wù)器進(jìn)行維護(hù),重新組織目錄結(jié)構(gòu),變換URL甚至改變到新的域名等等,而為了讓客戶不會因此受到任何影響,最好的方法就是使用Apache Rewrite Rule(重寫規(guī)則)。

三: 重寫規(guī)則的作用范圍

1) 可以使用在Apache主配置文件httpd.conf中
2) 可以使用在httpd.conf里定義的虛擬主機(jī)配置中
3) 可以使用在基本目錄的跨越配置文件.htaccess

四:重寫規(guī)則的應(yīng)用條件

只有當(dāng)用戶的WEB請求最終被導(dǎo)向到某臺web服務(wù)器的Apache后臺,則這臺WEB服務(wù)器接受進(jìn)來的請求,根據(jù)配置文件該請求是主配置還是虛擬主機(jī),再根據(jù)用戶在瀏覽器中請求的URI來配對重寫規(guī)則并且根據(jù)實(shí)際的請求路徑配對.htaccess中的重寫規(guī)則。最后把請求的內(nèi)容傳回給用戶,該響應(yīng)可能有兩種:

1) 對瀏覽器請求內(nèi)容的外部重定向(Redirect)到另一個URL。

讓瀏覽器再次以新的URI發(fā)出請求(R=301或者R=302,臨時的或是永久的重定向)
如:一個網(wǎng)站有正規(guī)的URL和別名URL,對別名URL進(jìn)行重定向到正規(guī)URL,或者網(wǎng)站改換成了新的域名,則把舊的域名重定向到新的域名(Redirect)

2) 也可能是由Apache內(nèi)部子請求代理產(chǎn)生新的內(nèi)容送回給客戶[P,L]

這是Apache內(nèi)部根據(jù)重寫后的URI內(nèi)部通過代理模塊請求內(nèi)容并送回內(nèi)容給客戶,而客戶端瀏覽器并不知道,瀏覽器中的URI不會被重寫。但實(shí)際內(nèi)容被Apache根據(jù)重寫規(guī)則后的URI得到。

如:在公司防火墻上運(yùn)行的Apache啟動這種代理重寫規(guī)則,代理對內(nèi)部網(wǎng)段上的WEB服務(wù)器的請求。

五:重寫規(guī)則怎樣工作?

我們假定在編譯Apache時已經(jīng)把mod_rewrite編譯成模塊,確信你的httpd.conf中有

LoadModule rewrite_module libexec/mod_rewrite.so

并且在Addmodule中有

Addmodule mod_rewrite.c

則可以使用重寫規(guī)則。

當(dāng)外部請求來到Apache,Apache調(diào)用重寫規(guī)則中的定義來重寫由用戶瀏覽器指定請求的URI,最后被重寫的URI如果是重定向,則送由瀏覽器作再一次請求;如果是代理則把重寫后的URI交給代理模塊請求最終的內(nèi)容(Content),最后把內(nèi)容送回給瀏覽器。

六: 何時使用.htaccess中的重寫規(guī)則定義?

假如你對你的的網(wǎng)站內(nèi)容所在的服務(wù)器沒有管理員權(quán)限,或者你的網(wǎng)站放在ISP的服務(wù)器上托管等等條件下,你無法改寫主配置文件,然而你可以對你的WEB站點(diǎn)內(nèi)容所在的目錄有寫權(quán)限,則你可以設(shè)置自己的.htaccess文件達(dá)到同樣的目的。但你需要確定主配置文件中對你的網(wǎng)站所在的目錄定義了下面的內(nèi)容:

Options Indexes FollowSymLinks
AllowOverride all

否則你的.htaccess不會工作。

七: 應(yīng)用舉例

假定Apache被編譯安裝在主機(jī)192.168.1.56的/usr/local/apache/ 目錄下面,我們編譯進(jìn)了重寫和代理模塊。

1) 隱藏Apache下的某個目錄,使得對該目錄的任何請求都重定向到另一個文件。
a> httpd.conf的實(shí)現(xiàn)方法

我們放下面的部分到/usr/local/apache/conf/httpd.conf

options Indexes followsymlinks
allowoverride all
rewriteengine on
rewritebase /
rewriterule ^(.*)$ index.html.en [R=301]

注:rewriteengine on 為重寫引擎開關(guān),如果設(shè)為off,則任何重寫規(guī)則定義將不被應(yīng)用,該開關(guān)的另一好處就是如果為了臨時拿掉重寫規(guī)則,則改為off再重啟動Apache即可,不必將下面一條條的重寫規(guī)則注釋掉。

rewritebase / 的作用是如果在下面的rewriterule定義中被重寫后的部分(此處為文件名index.html.en)前面沒有/,則是相對目錄,相對于這個rewritebase后面的定義也就是/usr/local/apache/htdocs/index.html.en,否則,如果此處沒有rewritebase /這一項(xiàng),則被重寫成
https://192.168.1.56/usr/local/apache/htdocs/manual/index.html.en ,顯然是不正確的。

不過這里我們也可以不用rewritebase / , 而改為

rewriteengine on
rewriterule ^(.*)$ /index.html.en [R=301]
或者
rewriteengine on
rewriterule ^(.*)$ https://192.168.1.56/index.html.en [R=301]

b> .htaccess的實(shí)現(xiàn)方法

我們先放下面的部分到httpd.conf

options Indexes followsymlinks
allowoverride all

然后放下面的部分到/usr/local/apache/htdocs/manual/.htaccess中

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

注:對文件.htaccess所作的任何改動不需要重啟動Apache.

問:要是把這個manual目錄重定向到用戶jephe的自己的主目錄呢?
用下面的.htaccess方案。

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

則對manual目錄下任何文件的請求被重定向到~jephe目錄下相同文件的請求。

2) 轉(zhuǎn)換www.username.domain.com的對于username的主頁請求為
www.domain.com/username

對于HTTP/1.1的請求包括一個Host: HTTP頭,我們能用下面的規(guī)則集重寫
https://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 條件重寫規(guī)則,當(dāng)滿足后面定義的條件后才會應(yīng)用下面的重寫規(guī)則,rewritecond有各種變量,請查閱相關(guān)文檔。

3) 防火墻上的重寫規(guī)則代理內(nèi)部網(wǎng)段上服務(wù)器的請求。

NameVirtualhost 1.2.3.4
servername www.domain.com
rewriteengine on
proxyrequest on
rewriterule ^/(.*)$ https://192.168.1.3/$1 [P,L]

注:當(dāng)外部瀏覽器請求www.domain.com時被解析到IP地址1.2.3.4 ,Apache 交出mod_rewrite處理轉(zhuǎn)換成https://192.168.1.3/$1后再交由代理模塊mod_proxy得到內(nèi)容后傳送回用戶的瀏覽器。

4) 基本預(yù)先設(shè)定的轉(zhuǎn)換MAP表進(jìn)行重寫rewritemap轉(zhuǎn)換www.domain.com/{countrycode}/anypath 到Map表中規(guī)定的URI,上面是虛擬主機(jī)中的定義

rewritelog /usr/local/apache/logs/rewrite.log
rewriteloglevel 9

rewriteengine on
proxyrequest on
rewritemap sitemap txt:/usr/local/apache/conf/rewrite.map
rewriterule ^/([^/]+)+/(.*)$ https://%{REMOTE_HOST}::$1 [C]
rewriterule (.*)::([a-z]+)$ ${sitemap:$2|https://h.i.j.k/} [R=301,L]

文件/usr/local/apache/conf/rewrite.map的內(nèi)容如下:

sg https://a.b.c.d/
sh https://e.f.g.h/

注: 當(dāng)用戶請求https://www.domain.com/sg/anypath時被重寫為https://a.b.c.d/anypath .

當(dāng)需要調(diào)試時請用rewritelog and rewriteloglevel 9聯(lián)合,9為最大即得到最多的調(diào)試信息。最小為1,最小的調(diào)試信息,默認(rèn)為0,沒有調(diào)試信息。

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

關(guān)鍵詞標(biāo)簽:應(yīng)用,常見,規(guī)則,重寫,

相關(guān)閱讀

文章評論
發(fā)表評論

熱門文章 ISAPI Rewrite實(shí)現(xiàn)IIS圖片防盜鏈ISAPI Rewrite實(shí)現(xiàn)IIS圖片防盜鏈IIS6.0下配置MySQL+PHP5+Zend+phpMyAdminIIS6.0下配置MySQL+PHP5+Zend+phpMyAdmin在Windows服務(wù)器上快速架設(shè)視頻編解碼器全攻在Windows服務(wù)器上快速架設(shè)視頻編解碼器全攻win2000server IIS和tomcat5多站點(diǎn)配置win2000server IIS和tomcat5多站點(diǎn)配置

相關(guān)下載

人氣排行 XAMPP配置出現(xiàn)403錯誤“Access forbidden!”的解決辦法WIN2003 IIS6.0+PHP+ASP+MYSQL優(yōu)化配置訪問網(wǎng)站403錯誤 Forbidden解決方法Server Application Unavailable的解決辦法如何從最大用戶并發(fā)數(shù)推算出系統(tǒng)最大用戶數(shù)報錯“HTTP/1.1 400 Bad Request”的處理方法http 500內(nèi)部服務(wù)器錯誤的解決辦法(windows xp + IIS5.0)Windows Server 2003的Web接口