Apache的ReWrite的應(yīng)用
Apache的mod_rewrite是提供了強(qiáng)大URL操作的殺手級(jí)的模塊,可以實(shí)現(xiàn)幾乎所有你夢(mèng)想的URL操作類(lèi)型,其代價(jià)是你必須接受其復(fù)雜性,因
為mod_rewrite的主要障礙就是初學(xué)者不容易理解和運(yùn)用,即使是Apache專(zhuān)家有時(shí)也會(huì)發(fā)掘出mod_rewrite的新用途。
換句話說(shuō):對(duì)mod_rewrite,或者是打退堂鼓永不再用,或者是喜歡它并一生受用。
ReWrite可以應(yīng)用在以下方面或者解決以下問(wèn)題:
URL的規(guī)劃
規(guī)范的URL
說(shuō)明:
在有些網(wǎng)站服務(wù)器上,一個(gè)資源會(huì)擁有多個(gè)URL,在實(shí)際應(yīng)用和發(fā)布中應(yīng)該被使用的是規(guī)范的URL,其他的則是簡(jiǎn)寫(xiě)或者是內(nèi)部使用的。無(wú)論
用戶(hù)在請(qǐng)求中使用什么形式的URL,他最終看見(jiàn)的都應(yīng)該是規(guī)范的URL。
方案:
對(duì)所有的不規(guī)范的URL執(zhí)行一個(gè)外部的HTTP重定向,以改變它在瀏覽器地址欄中的顯示及其后繼的請(qǐng)求。下例中的規(guī)則集用規(guī)范的/u/user替
換/~user,并修正了/u/user所遺漏的后綴的斜杠。
代碼:
RewriteRule ^/~([^/]+)/?(.*) /u/$1/$2 [R]
RewriteRule ^/([uge])/([^/]+)$ /$1/$2/ [R]
被移動(dòng)過(guò)的DocumentRoot
說(shuō)明:
通常,網(wǎng)站服務(wù)器的DocumentRoot直接對(duì)應(yīng)于URL"/",但是,它常常不是處于最高一級(jí),而可能只是眾多數(shù)據(jù)池中的一個(gè)實(shí)體。比如,在
Intranet站點(diǎn)中,有/e/www/(WWW的主頁(yè))、/e/sww/ (Intranet的主頁(yè))等等,而DocumentRoot指向了/e/www/,則必須保證此數(shù)據(jù)池中的所
有內(nèi)嵌的圖片和其他元素對(duì)后繼請(qǐng)求有效。
方案:
只須重定向URL /到/e/www/即可。這個(gè)方案看起來(lái)很簡(jiǎn)單,但只是有了mod_rewrite模塊的支持,它才簡(jiǎn)單,因?yàn)閭鹘y(tǒng)的URL Aliases機(jī)制(
由mod_alias及其相關(guān)模塊提供)只是作了一個(gè)前綴匹配,DocumentRoot是一個(gè)對(duì)所有URL的前綴,因而無(wú)法實(shí)現(xiàn)這樣的重定向。而用
mod_rewrite的確很簡(jiǎn)單:
代碼:
RewriteEngine on
RewriteRule ^/$ /e/www/ [R]
后綴斜杠的問(wèn)題
說(shuō)明:
每個(gè)網(wǎng)管對(duì)引用目錄后綴斜杠的問(wèn)題都有一本苦經(jīng),如果遺漏了,服務(wù)器會(huì)產(chǎn)生一個(gè)錯(cuò)誤,因?yàn)槿绻?qǐng)求是/~quux/foo而不是/~quux/foo/
,服務(wù)器會(huì)去找一個(gè)叫foo的文件,而它是一個(gè)目錄,所以就報(bào)錯(cuò)了。事實(shí)上,大多數(shù)情況下,它自己會(huì)試圖修正這個(gè)錯(cuò)誤,但是有時(shí)候需
要你手工糾正,比如,在重寫(xiě)了許多CGI腳本中的復(fù)雜的URL以后。
方案:
解決這個(gè)微妙問(wèn)題的方案是讓服務(wù)器自動(dòng)添加后綴的斜杠。對(duì)此,必須使用一個(gè)外部的重定向,使瀏覽器正確地處理后繼的對(duì)諸如圖片的請(qǐng)
求。如果僅僅作一個(gè)內(nèi)部的重寫(xiě),可能只對(duì)目錄頁(yè)面有效,而對(duì)內(nèi)嵌有使用相對(duì)URL的圖片的頁(yè)面則無(wú)效,因?yàn)闉g覽器有請(qǐng)求內(nèi)嵌目標(biāo)的可
能。比如,如果不用外部重定向,/~quux/foo/index.html頁(yè)面中對(duì)image.gif的請(qǐng)求,其結(jié)果將是/~quux/image.gif!。
所以,應(yīng)該這樣寫(xiě):
代碼:
RewriteEngine on
RewriteBase /~quux/
RewriteRule ^foo$ foo/ [R]
又懶又瘋狂的做法是把這些寫(xiě)入其宿主目錄中的頂級(jí).htaccess中,但是須注意,如此會(huì)帶來(lái)一些處理上的開(kāi)銷(xiāo)。
代碼:
RewriteEngine on
RewriteBase /~quux/
RewriteCond % -d
RewriteRule ^(.+[^/])$ $1/ [R]
集群網(wǎng)站的同類(lèi)URL規(guī)劃
說(shuō)明:
我們希望在一個(gè)Intranet集群網(wǎng)站中,對(duì)所有WWW服務(wù)器建立一個(gè)同類(lèi)的一致性的URL規(guī)劃,也就是,所有的URL(對(duì)單個(gè)服務(wù)器來(lái)說(shuō),是本地
的依賴(lài)于此服務(wù)器的!)是獨(dú)立于服務(wù)器的!我們需要的是一個(gè)具有獨(dú)立于服務(wù)器的一致性規(guī)劃的WWW名稱(chēng)空間,即,URL不需要包含正確的
物理的目標(biāo)服務(wù)器,而由集群本身來(lái)自動(dòng)定位物理的目標(biāo)主機(jī)。
方案:
首先,目標(biāo)服務(wù)器的信息來(lái)自(產(chǎn)生)于包含有用戶(hù)、組以及實(shí)體的外部地圖,其格式形如:
代碼:
user1 server_of_user1
user2 server_of_user2
: :
這些信息被存入map.xxx-to-host文件。其次,如果URL在一個(gè)服務(wù)器上無(wú)效,需要引導(dǎo)所有的服務(wù)器重定向URL
代碼:
/u/user/anypath
/g/group/anypath
/e/entity/anypath
RewriteRule ^/([uge])/([^/]+)/?$ /$1/$2/.www/
RewriteRule ^/([uge])/([^/]+)/([^.]+.+) /$1/$2/.www/$3\
移動(dòng)宿主目錄到不同的網(wǎng)站服務(wù)器
說(shuō)明:
通常,許多網(wǎng)管在建立一個(gè)新的網(wǎng)站服務(wù)器時(shí),都會(huì)有這樣的要求:重定向一個(gè)網(wǎng)站服務(wù)器上的所有宿主目錄到另一個(gè)網(wǎng)站服務(wù)器。
結(jié)構(gòu)化的宿主目錄
說(shuō)明:
一些擁有幾千個(gè)用戶(hù)的網(wǎng)站通常都使用結(jié)構(gòu)化的宿主目錄規(guī)劃,即,每個(gè)宿主目錄位于一個(gè)帶有特定前綴比如其用戶(hù)名的第一個(gè)字符的子目
錄下。那么,/~foo/anypath代表/home/f/foo/.www/anypath,而/~bar/anypath代表/home/b/bar/.www/anypath。
方案:
可以使用下列規(guī)則集來(lái)擴(kuò)展~以達(dá)到上述目的。
代碼:
RewriteEngine on
RewriteRule ^/~(([a-z])[a-z0-9]+)(.*) /home/$2/$1/.www$3
文件系統(tǒng)的重組
說(shuō)明:
這是一個(gè)不加雕琢的例子:一個(gè)大量使用針對(duì)目錄的規(guī)則集以實(shí)現(xiàn)平滑觀感,而從來(lái)不用調(diào)整數(shù)據(jù)結(jié)構(gòu)的殺手級(jí)的應(yīng)用。背景:net.sw從
1992年開(kāi)始,存放了我收集的免費(fèi)的有效的Unix軟件包。它是我的愛(ài)好也是我的工作,因?yàn)樵趯W(xué)習(xí)計(jì)算機(jī)科學(xué)的同時(shí),業(yè)余時(shí)間還做了多年
的系統(tǒng)和網(wǎng)絡(luò)的管理員。每周我都需要整理軟件,因而建立了一個(gè)層次很深的目錄結(jié)構(gòu)來(lái)存放各種軟件包:
代碼:
drwxrwxr-x 2 netsw users 512 Aug 3 18:39 Audio/
drwxrwxr-x 2 netsw users 512 Jul 9 14:37 Benchmark/
drwxrwxr-x 12 netsw users 512 Jul 9 00:34 Crypto/
drwxrwxr-x 5 netsw users 512 Jul 9 00:41 Database/
drwxrwxr-x 4 netsw users 512 Jul 30 19:25 Dicts/
drwxrwxr-x 10 netsw users 512 Jul 9 01:54 Graphic/
drwxrwxr-x 5 netsw users 512 Jul 9 01:58 Hackers/
drwxrwxr-x 8 netsw users 512 Jul 9 03:19 InfoSys/
drwxrwxr-x 3 netsw users 512 Jul 9 03:21 Math/
drwxrwxr-x 3 netsw users 512 Jul 9 03:24 Misc/
drwxrwxr-x 9 netsw users 512 Aug 1 16:33 Network/
drwxrwxr-x 2 netsw users 512 Jul 9 05:53 Office/
drwxrwxr-x 7 netsw users 512 Jul 9 09:24 SoftEng/
drwxrwxr-x 7 netsw users 512 Jul 9 12:17 System/
drwxrwxr-x 12 netsw users 512 Aug 3 20:15 Typesetting/
drwxrwxr-x 10 netsw users 512 Jul 9 14:08 X11/
1996年7月,我決定通過(guò)一個(gè)漂亮的Web接口公開(kāi)我的收藏。“漂亮”是指提供一個(gè)接口以直接瀏覽整個(gè)目錄結(jié)構(gòu),同時(shí)不對(duì)這個(gè)結(jié)構(gòu)做任何改
變 - 甚至也不在結(jié)構(gòu)頂部放置CGI腳本。為什么呢?因?yàn)檫@個(gè)結(jié)構(gòu)還要能夠被FTP訪問(wèn),而且我不希望其中有任何Web或者CGI的成分。
方案:
這個(gè)方案分為兩個(gè)部分:第一個(gè)部分,是用于在空閑時(shí)間建立所有目錄頁(yè)面的CGI腳本集。我把它們放在/e/netsw/.www/,如下:
代碼:
-rw-r--r-- 1 netsw users 1318 Aug 1 18:10 .wwwacl
drwxr-xr-x 18 netsw users 512 Aug 5 15:51 DATA/
-rw-rw-rw- 1 netsw users
關(guān)鍵詞:apache,web服務(wù)器
閱讀本文后您有什么感想? 已有 人給出評(píng)價(jià)!
- 101
- 2
- 2
- 104
- 14
- 2