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