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