Apache rewrite重寫(xiě)規(guī)則的常見(jiàn)應(yīng)用
更新時(shí)間:2008年03月15日 18:45:00 作者:
---- 本文旨在提供如何用Apache重寫(xiě)規(guī)則來(lái)解決一些常見(jiàn)的URL重寫(xiě)方法的問(wèn)題,通過(guò)常見(jiàn)的實(shí)例給用戶一些使用重寫(xiě)規(guī)則的基本方法和線索。
一、為什么需要用重寫(xiě)規(guī)則
---- 網(wǎng)站的生命在于不斷地進(jìn)行更新和維護(hù),根據(jù)業(yè)務(wù)發(fā)展的需求轉(zhuǎn)移服務(wù)器進(jìn)行維護(hù)、重新組織目錄結(jié)構(gòu)、變換URL甚至改變到新的域名等情況是經(jīng)常發(fā)生的。為了讓客戶不會(huì)因此受到任何影響,最好的方法就是使用Apache Rewrite Rule(重寫(xiě)規(guī)則)。
二、重寫(xiě)規(guī)則的作用范圍
---- 1.使用在Apache主配置文件httpd.conf中。
---- 2.使用在httpd.conf里定義的配置中。
---- 3.使用在基本目錄的跨越配置文件.htaccess中。
三、重寫(xiě)規(guī)則的應(yīng)用條件
---- 當(dāng)用戶的Web請(qǐng)求最終被導(dǎo)向到某臺(tái)Web服務(wù)器的Apache守護(hù)進(jìn)程,Apache根據(jù)配置文件判斷該請(qǐng)求是主配置還是,再根據(jù)用戶在瀏覽器中請(qǐng)求的URL來(lái)匹配重寫(xiě)規(guī)則,并且根據(jù)實(shí)際的請(qǐng)求路徑匹配.htaccess中的重寫(xiě)規(guī)則,最后把請(qǐng)求的內(nèi)容傳回給用戶。該響應(yīng)可能有2種。
---- 1.將請(qǐng)求內(nèi)容外部重定向(Redirect)到另一個(gè)URL
---- 讓瀏覽器再次以新的URL發(fā)出請(qǐng)求(R=301或者R=302,臨時(shí)的或是永久的重定向)。
---- 例如,一個(gè)網(wǎng)站有正規(guī)的URL和別名URL,對(duì)別名URL進(jìn)行重定向到正規(guī)URL,或者網(wǎng)站改換成了新的域名,則把舊的域名重定向到新的域名。
---- 2.由Apache內(nèi)部子請(qǐng)求代理產(chǎn)生新的內(nèi)容送回給客戶[P,L]
---- 這是Apache內(nèi)部根據(jù)重寫(xiě)后的URL,通過(guò)代理模塊請(qǐng)求內(nèi)容并將最終內(nèi)容送回給客戶,客戶端瀏覽器不必再次請(qǐng)求,瀏覽器中的URL不會(huì)被重寫(xiě),但實(shí)際內(nèi)容由Apache根據(jù)重寫(xiě)規(guī)則后的URL生成。
---- 例如,在公司防火墻上運(yùn)行的Apache啟動(dòng)這種代理重寫(xiě)規(guī)則,代理對(duì)內(nèi)部網(wǎng)段上的Web服務(wù)器的請(qǐng)求。
四、重寫(xiě)規(guī)則怎樣工作
---- 我們假定在編譯Apache時(shí)已經(jīng)把mod_rewrite編譯成模塊,確信您的httpd.conf中有LoadModule rewrite_module libexec/mod_rewrite.so,并且在Addmodule中有Addmodule mod_rewrite.c,則可以使用重寫(xiě)規(guī)則。
---- 當(dāng)外部請(qǐng)求到達(dá)Apache,Apache調(diào)用重寫(xiě)規(guī)則中的定義來(lái)重寫(xiě)由用戶瀏覽器指定請(qǐng)求的URL,最后被重寫(xiě)的URL如果是重定向,則送交瀏覽器做再一次請(qǐng)求;如果是代理則把重寫(xiě)后的URL交給代理模塊請(qǐng)求最終的內(nèi)容(Content),最后把內(nèi)容送回給瀏覽器。
五、何時(shí)使用.htaccess中的重寫(xiě)規(guī)則定義
---- 假如您對(duì)網(wǎng)站內(nèi)容所在的服務(wù)器沒(méi)有管理員權(quán)限,或者您的網(wǎng)站內(nèi)容放在ISP的服務(wù)器上托管,無(wú)法改寫(xiě)主配置文件,但是您對(duì)Web站點(diǎn)內(nèi)容所在的目錄有寫(xiě)權(quán)限,則可以設(shè)置自己的.htaccess文件達(dá)到同樣的目的。但您需要確定主配置文件中對(duì)您的網(wǎng)站所在的目錄定義了下面的內(nèi)容,否則您的.htaccess不會(huì)工作。
---- < Directory /usr/local/apache/htdocs/www.abc.com> options indexes followsymLinks
---- allowoverride all
---- < /Directory >
六、應(yīng)用舉例
---- 假定Apache被編譯安裝在主機(jī)192.168.1.56的/usr/local/apache目錄下面,同時(shí)編譯了重寫(xiě)和代理模塊。
---- 1.隱藏Apache下的某個(gè)目錄,使得對(duì)該目錄的任何請(qǐng)求都重定向到另一個(gè)文件
---- (1)httpd.conf的實(shí)現(xiàn)方法
---- 我們將下面的部分放到/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”為重寫(xiě)引擎開(kāi)關(guān),如果設(shè)為“off”,則任何重寫(xiě)規(guī)則定義將不被應(yīng)用,該開(kāi)關(guān)的另一用處就是如果為了臨時(shí)去掉重寫(xiě)規(guī)則,可以將引擎開(kāi)關(guān)設(shè)為“off”再重新啟動(dòng)Apache即可,不必將其中的各條重寫(xiě)規(guī)則注釋掉。
---- “rewritebase /”的作用是如果在下面的rewriterule定義中被重寫(xiě)后的部分(此處為文件名index.html.en)前面沒(méi)有“/”,則表明是相對(duì)目錄,相對(duì)于這個(gè)rewritebase后面的定義也就是/usr/local/apache/htdocs/index.html.en,否則,如果此處沒(méi)有“rewritebase /”這一項(xiàng),則被重寫(xiě)成,顯然是不正確的。
---- 我們也可以不用“rewritebase /”,而是將其改為如下部分。
---- rewriteengine on
---- rewriterule ^(.*)$ /index.html.en [R=301]
---- 或者更改為:
---- rewriteengine on
---- rewriterule ^(.*)$ [R=301]
---- (2).htaccess的實(shí)現(xiàn)方法
---- 我們將下面的部分放到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]
---- 注: 對(duì)文件.htaccess所做的任何改動(dòng)不需要重啟動(dòng)Apache。
---- 您還可以利用.htaccess方案將這個(gè)manual目錄重定向到用戶jephe自己的主目錄。
---- rewriteengine on
---- rewritebase /~jephe/
---- rewriterule ^(.*)$ $1 [R=301]
---- 這樣,對(duì)manual目錄下任何文件的請(qǐng)求被重定向到~jephe目錄下相同文件的請(qǐng)求。
---- 2.將對(duì)于username的主頁(yè)請(qǐng)求轉(zhuǎn)換為對(duì)的請(qǐng)求
---- 對(duì)于HTTP/1.1的請(qǐng)求包括一個(gè)Host: HTTP頭,我們能用下面的規(guī)則集重寫(xiě) .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”表明是條件重寫(xiě)規(guī)則,當(dāng)滿足后面定義的條件后才會(huì)應(yīng)用下面的重寫(xiě)規(guī)則,“rewritecond”有各種變量,請(qǐng)查閱相關(guān)文檔。
---- 3.防火墻上的重寫(xiě)規(guī)則代理內(nèi)部網(wǎng)段上服務(wù)器的請(qǐng)求
---- NameVirtualhost 1.2.3.4
---- < Virtualhost 1.2.3.4:80 > servername
---- rewriteengine on
---- proxyrequest on
---- rewriterule ^/(.*)$ [P,L]
---- < /Virtualhost >
---- 注: 當(dāng)外部瀏覽器請(qǐng)求時(shí),將被解析到IP地址1.2.3.4,Apache交由mod_rewrite處理,轉(zhuǎn)換成后再交由代理模塊mod_proxy,得到內(nèi)容后傳送回用戶的瀏覽器。
---- 4.基本預(yù)先設(shè)定的轉(zhuǎn)換Map表進(jìn)行重寫(xiě)rewritemap
---- 轉(zhuǎn)換到Map表中規(guī)定的URL,前面是中的定義。
---- rewritelog /usr/local/apache/logs/rewrite.log
---- rewriteloglevel 9
---- rewriteengine on
---- proxyrequest on
---- rewritemap sitemap txt:/usr/local/apache/conf/rewrite.map
---- rewriterule ^/([^/]+)+/(.*)$ [C]
---- rewriterule (.*)::([a-z]+)$ ${sitemap:$2|http://h.i.j.k/} [R=301,L]
---- 文件/usr/local/apache/conf/rewrite.map的內(nèi)容如下:
---- sg
---- sh
---- 注: 當(dāng)用戶請(qǐng)求時(shí)被重寫(xiě)為。當(dāng)需要調(diào)試時(shí)請(qǐng)用rewritelog和 rewriteloglevel 9聯(lián)合,9為最大,即得到最多的調(diào)試信息;最小為1,表示得到最少的調(diào)試信息;默認(rèn)為0,表示沒(méi)有調(diào)試信息。
---- sitemap的語(yǔ)法是${sitemap: LookupKey | Defaultvalue},有些書(shū)上把$寫(xiě)成了%是錯(cuò)誤的。
(作者:吳阿亭)
您可能感興趣的文章:
- apache的rewrite規(guī)則使用說(shuō)明
- 開(kāi)啟Apache mod_rewrite模塊示例代碼
- 13個(gè)實(shí)用的Apache Rewrite重寫(xiě)規(guī)則
- 淺談apache和nginx的rewrite的區(qū)別
- Apache Rewrite實(shí)現(xiàn)URL的301跳轉(zhuǎn)和域名跳轉(zhuǎn)
- Apache Rewrite url重定向功能的簡(jiǎn)單配置
- 讓Apache支持Rewrite靜態(tài)頁(yè)面重寫(xiě)的方法
- Linux下Apache安裝/增加mod_rewrite模塊的方法
- 學(xué)習(xí)Apache的mod rewrite、access寫(xiě)法
- Apache rewrite的重寫(xiě)相關(guān)的參數(shù)說(shuō)明
- apache rewrite_module模塊使用教程
- 用ISAPI_Rewrite讓IIS也支持如Apache下.htaccess的URL重寫(xiě)
- apache rewrite規(guī)則實(shí)現(xiàn)白名單
相關(guān)文章
win2003下安裝apache2.2.3+php5.2+mysql+Zend的配置方法
win2003下安裝apache2.2.3+php5.2+mysql+Zend的配置方法...2007-05-05
Win2003服務(wù)器 IIS6.0 rewrite的設(shè)置圖文教程
Win2003服務(wù)器 IIS6.0 rewrite的設(shè)置圖文教程...2007-07-07
IIS日志轉(zhuǎn)到sqlserver的實(shí)現(xiàn)方法
IIS日志轉(zhuǎn)到sqlserver的實(shí)現(xiàn)方法...2007-06-06

