1. 程式人生 > >Apache 重寫規則的常見應用 (rewrite)

Apache 重寫規則的常見應用 (rewrite)

五:重寫規則怎樣工作?
我們假定在編譯Apache時已經把mod_rewrite編譯成模組,確信你的httpd.conf中有
LoadModule rewrite_module libexec/mod_rewrite.so
並且在Addmodule中有
Addmodule mod_rewrite.c
則可以使用重寫規則。
當外部請求來到Apache,Apache呼叫重寫規則中的定義來重寫由使用者瀏覽器指定請求的
URI,最後被重寫的URI如果是重定向,則送由瀏覽器作再一次請求;如果是代理則把重寫
後的URI交給代理模組請求最終的內容(Content),最後把內容送回給瀏覽器。

六: 何時使用.htaccess中的重寫規則定義?
假如你對你的的網站內容所在的伺服器沒有管理員許可權,或者你的網站放在ISP的伺服器
上託管等等條件下,你無法改寫主配置檔案,然而你可以對你的WEB站點內容所在的目錄
有寫許可權,則你可以設定自己的.htaccess
檔案達到同樣的目的。但你需要確定主配置檔案中對你的網站所在的目錄定義了下面的內
容:

Options Indexes FollowSymLinks
AllowOverride all

否則你的.htaccess不會工作。

七: 應用舉例
假定Apache被編譯安裝在主機192.168.1.56的/usr/local/apache/ 目錄下面,我們編
譯進了重寫和代理模組。

1) 隱藏Apache下的某個目錄,使得對該目錄的任何請求都重定向到另一個檔案。

a> httpd.conf的實現方法

我們放下面的部分到/usr/local/apache/conf/httpd.conf


options Indexes followsymlinks
allowoverride all
rewriteengine on
rewritebase /
rewriterule ^(.*)$ index.html.en [R=301]


注:rewriteengine on 為重寫引擎開關,如果設為off,則任何重寫規則定義將不被應
用,該開關的另一好處就是如果為了臨時拿掉重寫規則,則改為off再重啟動Apache即
可,不必將下面一條條的重寫規則註釋掉。
rewritebase / 的作用是如果在下面的rewriterule定義中被重寫後的部分(此處為檔案
名index.html.en)前面沒有/,則是相對目錄,相對於這個rewritebase後面的定義也就
是/usr/local/apache/htdocs/index.html.en,否則,如果此處沒有rewritebase /這
一項,則被重寫成
http://192.168.1.56/usr/local/apache/htdocs/manual/index.html.en ,顯然是
不正確的。

不過這裡我們也可以不用rewritebase / , 而改為
rewriteengine on
rewriterule ^(.*)$ /index.html.en [R=301]
或者
rewriteengine on
rewriterule ^(.*)$ http://192.168.1.56/index.html.en [R=301]

b> .htaccess的實現方法

我們先放下面的部分到httpd.conf


options Indexes followsymlinks
allowoverride all


然後放下面的部分到/usr/local/apache/htdocs/manual/.htaccess中
rewriteengine on
rewritebase /
rewriterule ^(.*)$ index.html.en [R=301]

注:對檔案.htaccess所作的任何改動不需要重啟動Apache.

問:要是把這個manual目錄重定向到使用者jephe的自己的主目錄呢?
用下面的.htaccess方案。
rewriteengine on
rewritebase /~jephe/
rewriterule ^(.*)$ $1 [R=301]

則對manual目錄下任何檔案的請求被重定向到~jephe目錄下相同檔案的請求。

2) 轉換www.username.domain.com的對於username的主頁請求為
www.domain.com/username

對於HTTP/1.1的請求包括一個Host: HTTP頭,我們能用下面的規則集重寫
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 條件重寫規則,當滿足後面定義的條件後才會應用下面的重寫規則,
rewritecond有各種變數
,請查閱相關文件。

3) 防火牆上的重寫規則代理內部網段上伺服器的請求。

NameVirtualhost 1.2.3.4


servername www.domain.com
rewriteengine on
proxyrequest on
rewriterule ^/(.*)$ http://192.168.1.3/$1 [P,L]


注:當外部瀏覽器請求www.domain.com時被解析到IP地址1.2.3.4 ,Apache 交出
mod_rewrite處理轉換成
http://192.168.1.3/$1後再交由代理模組mod_proxy得到內容後傳送回使用者的瀏覽器。


4) 基本預先設定的轉換MAP表進行重寫 rewritemap

轉換www.domain.com/{countrycode}/anypath 到Map表中規定的URI,上面是虛擬主機
中的定義

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的內容如下:

sg http://a.b.c.d/
sh http://e.f.g.h/

注: 當用戶請求http://www.domain.com/sg/anypath時被重寫為
http://a.b.c.d/anypath .
當需要除錯時請用rewritelog and rewriteloglevel 9聯合,9為最大即得到最多的除錯
資訊
最小為1,最小的除錯資訊,預設為0,沒有除錯資訊。
sitemap的語法是${sitemap: LookupKey | Defaultvalue} ,有些書上把$寫成了%是錯
誤的。

-----