您當(dāng)前所在位置:
首頁(yè) →
服務(wù)器 →
WEB服務(wù)器 →
Apache 重寫規(guī)則的常見應(yīng)用(rewrite)
Apache 重寫規(guī)則的常見應(yīng)用(rewrite)
時(shí)間:2015-06-28 00:00:00
來(lái)源:IT貓撲網(wǎng)
作者:網(wǎng)管聯(lián)盟
我要評(píng)論(0)
- 一:目的
本文旨在提供如何用Apache重寫規(guī)則來(lái)解決一些常見的URL重寫方法的問題,通過(guò)常見的實(shí)例給用戶一些使用重寫規(guī)則的基本方法和線索。
二:為什么需要用重寫規(guī)則?
一個(gè)網(wǎng)站,如果是長(zhǎng)期需要放在internet上提供服務(wù),必定會(huì)有不斷地更新和維護(hù),如臨時(shí)轉(zhuǎn)移到其它服務(wù)器進(jìn)行維護(hù),重新組織目錄結(jié)構(gòu),變換URL甚至改變到新的域名等等,而為了讓客戶不會(huì)因此受到任何影響,最好的方法就是使用Apache Rewrite Rule(重寫規(guī)則)。
三: 重寫規(guī)則的作用范圍
1) 可以使用在Apache主配置文件httpd.conf中
2) 可以使用在httpd.conf里定義的虛擬主機(jī)配置中
3) 可以使用在基本目錄的跨越配置文件.htaccess中
四:重寫規(guī)則的應(yīng)用條件
只有當(dāng)用戶的WEB請(qǐng)求最終被導(dǎo)向到某臺(tái)WEB服務(wù)器的Apache后臺(tái),則這臺(tái)WEB服務(wù)器接受進(jìn)來(lái)的請(qǐng)求,根據(jù)配置文件該請(qǐng)求是主配置還是虛擬主機(jī),再根據(jù)用戶在瀏覽器中請(qǐng)求的URI來(lái)配對(duì)重寫規(guī)則并且根據(jù)實(shí)際的請(qǐng)求路徑配對(duì).htaccess中的重寫規(guī)則。最后把請(qǐng)求的內(nèi)容傳回給用戶,該響應(yīng)可能有兩種:
1) 對(duì)瀏覽器請(qǐng)求內(nèi)容的外部重定向(Redirect)到另一個(gè)URL。
讓瀏覽器再次以新的URI發(fā)出請(qǐng)求(R=301或者R=302,臨時(shí)的或是永久的重定向)
如:一個(gè)網(wǎng)站有正規(guī)的URL和別名URL,對(duì)別名URL進(jìn)行重定向到正規(guī)URL,或者網(wǎng)站改換成了新的域名,則把舊的域名重定向到新的域名(Redirect)
2) 也可能是由Apache內(nèi)部子請(qǐng)求代理產(chǎn)生新的內(nèi)容送回給客戶[P,L]
這是Apache內(nèi)部根據(jù)重寫后的URI內(nèi)部通過(guò)代理模塊請(qǐng)求內(nèi)容并送回內(nèi)容給客戶,而客戶端瀏覽器并不知道,瀏覽器中的URI不會(huì)被重寫。但實(shí)際內(nèi)容被Apache根據(jù)重寫規(guī)則后的URI得到。
如:在公司防火墻上運(yùn)行的Apache啟動(dòng)這種代理重寫規(guī)則,代理對(duì)內(nèi)部網(wǎng)段上的WEB服務(wù)器的請(qǐng)求。
五:重寫規(guī)則怎樣工作?
我們假定在編譯Apache時(shí)已經(jīng)把mod_rewrite編譯成模塊,確信你的httpd.conf中有
LoadModule rewrite_module libexec/mod_rewrite.so
并且在Addmodule中有
Addmodule mod_rewrite.c
則可以使用重寫規(guī)則。
當(dāng)外部請(qǐng)求來(lái)到Apache,Apache調(diào)用重寫規(guī)則中的定義來(lái)重寫由用戶瀏覽器指定請(qǐng)求的URI,最后被重寫的URI如果是重定向,則送由瀏覽器作再一次請(qǐng)求;如果是代理則把重寫后的URI交給代理模塊請(qǐng)求最終的內(nèi)容(Content),最后把內(nèi)容送回給瀏覽器。
六: 何時(shí)使用.htaccess中的重寫規(guī)則定義?
假如你對(duì)你的的網(wǎng)站內(nèi)容所在的服務(wù)器沒有管理員權(quán)限,或者你的網(wǎng)站放在ISP的服務(wù)器上托管等等條件下,你無(wú)法改寫主配置文件,然而你可以對(duì)你的WEB站點(diǎn)內(nèi)容所在的目錄有寫權(quán)限,則你可以設(shè)置自己的.htaccess文件達(dá)到同樣的目的。但你需要確定主配置文件中對(duì)你的網(wǎng)站所在的目錄定義了下面的內(nèi)容:
Options Indexes FollowSymLinks
AllowOverride all
否則你的.htaccess不會(huì)工作。
七: 應(yīng)用舉例
假定Apache被編譯安裝在主機(jī)192.168.1.56的/usr/local/apache/ 目錄下面,我們編譯進(jìn)了重寫和代理模塊。
1) 隱藏Apache下的某個(gè)目錄,使得對(duì)該目錄的任何請(qǐng)求都重定向到另一個(gè)文件。
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)的另一好處就是如果為了臨時(shí)拿掉重寫規(guī)則,則改為off再重啟動(dòng)Apache即可,不必將下面一條條的重寫規(guī)則注釋掉。
rewritebase / 的作用是如果在下面的rewriterule定義中被重寫后的部分(此處為文件名index.html.en)前面沒有/,則是相對(duì)目錄,相對(duì)于這個(gè)rewritebase后面的定義也就是/usr/local/apache/htdocs/index.html.en,否則,如果此處沒有rewritebase /這一項(xiàng),則被重寫成
http://192.168.1.56/usr/local/apache/htdocs/manual/index.html.en ,顯然是不正確的。
不過(guò)這里我們也可以不用rewritebase / , 而改為
rewriteengine on
rewriterule ^(.*)$ /index.html.en [R=301]
或者
rewriteengine on
rewriterule ^(.*)$ http://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]
注:對(duì)文件.htaccess所作的任何改動(dòng)不需要重啟動(dòng)Apache.
問:要是把這個(gè)manual目錄重定向到用戶jephe的自己的主目錄呢?
用下面的.htaccess方案。
rewriteengine on
rewritebase /~jephe/
rewriterule ^(.*)$ $1 [R=301]
則對(duì)manual目錄下任何文件的請(qǐng)求被重定向到~jephe目錄下相同文件的請(qǐng)求。
2) 轉(zhuǎn)換www.username.domain.com的對(duì)于username的主頁(yè)請(qǐng)求為
www.domain.com/username
對(duì)于HTTP/1.1的請(qǐng)求包括一個(gè)Host: HTTP頭,我們能用下面的規(guī)則集重寫
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 條件重寫規(guī)則,當(dāng)滿足后面定義的條件后才會(huì)應(yīng)用下面的重寫規(guī)則,rewritecond有各種變量,請(qǐng)查閱相關(guān)文檔。
3) 防火墻上的重寫規(guī)則代理內(nèi)部網(wǎng)段上服務(wù)器的請(qǐng)求。
NameVirtualhost 1.2.3.4
servername www.domain.com
rewriteengine on
proxyrequest on
rewriterule ^/(.*)$ http://192.168.1.3/$1 [P,L]
注:當(dāng)外部瀏覽器請(qǐng)求www.domain.com時(shí)被解析到IP地址1.2.3.4 ,Apache 交出mod_rewrite處理轉(zhuǎn)換成http://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 ^/([^/]+)+/(.*)$ http://%{REMOTE_HOST}::$1 [C]
rewriterule (.*)::([a-z]+)$ ${sitemap:$2|http://h.i.j.k/} [R=301,L]
文件/usr/local/apache/conf/rewrite.map的內(nèi)容如下:
sg http://a.b.c.d/
sh http://e.f.g.h/
注: 當(dāng)用戶請(qǐng)求http://www.domain.com/sg/anypath時(shí)被重寫為http://a.b.c.d/anypath .
當(dāng)需要調(diào)試時(shí)請(qǐng)用rewritelog and rewriteloglevel 9聯(lián)合,9為最大即得到最多的調(diào)試信息。最小為1,最小的調(diào)試信息,默認(rèn)為0,沒有調(diào)試信息。
sitemap的語(yǔ)法是${sitemap: LookupKey | Defaultvalue} ,有些書上把$寫成了%是錯(cuò)誤的。關(guān)鍵詞標(biāo)簽:應(yīng)用,常見,規(guī)則,重寫,
相關(guān)閱讀
熱門文章
ISAPI Rewrite實(shí)現(xiàn)IIS圖片防盜鏈
IIS6.0下配置MySQL+PHP5+Zend+phpMyAdmin
在Windows服務(wù)器上快速架設(shè)視頻編解碼器全攻略
win2000server IIS和tomcat5多站點(diǎn)配置
人氣排行
XAMPP配置出現(xiàn)403錯(cuò)誤“Access forbidden!”的解決辦法
WIN2003 IIS6.0+PHP+ASP+MYSQL優(yōu)化配置
訪問網(wǎng)站403錯(cuò)誤 Forbidden解決方法
如何從最大用戶并發(fā)數(shù)推算出系統(tǒng)最大用戶數(shù)
Server Application Unavailable的解決辦法
報(bào)錯(cuò)“HTTP/1.1 400 Bad Request”的處理方法
Windows Server 2003的Web接口
http 500內(nèi)部服務(wù)器錯(cuò)誤的解決辦法(windows xp + IIS5.0)