Apache URL重寫(高級部分)

本文將補充mod_rewrite參考文檔。介紹使用mod_rewrite提供的一些高級技術。

注意,許多這些示例在特定伺服器配置中不會保持不變,因此您必須瞭解它們,而不是僅僅將示例剪切並粘貼到配置中。

跨多個後端的基於URL的分片

分配伺服器負載或存儲空間負擔的常用技術稱為“分片”。使用此方法時,前端伺服器將使用該URL始終“分片”用戶或對象以分隔後端伺服器。

解決辦法:
在外部映射檔中維護從用戶到目標伺服器的映射。如下所示:

user1 physical_host_of_user1
user2 physical_host_of_user2
: :

將它放入map.users-to-hosts檔中。目的是繪製映射 -

/u/user1/anypath

轉換為 -

http://physical_host_of_user1/u/user/anypath

因此,每個URL路徑在每個後端物理主機上都不需要有效。以下規則集在映射檔的幫助下執行此操作,假設server0是默認伺服器,如果用戶在映射中沒有條目,將使用該伺服器,配置如下:

RewriteEngine on
RewriteMap      users-to-hosts   "txt:/path/to/map.users-to-hosts"
RewriteRule   "^/u/([^/]+)/?(.*)"   "http://${users-to-hosts:$1|server0}/u/$1/$2"

即時內容再生

有時我們希望動態生成內容,一旦生成內容就會靜態存儲。此規則將檢查靜態檔是否存在,如果不存在,則生成它。如果需要,可以定期刪除靜態檔(例如,通過cron),並根據需要重新生成。

解決辦法:

這是通過以下規則集完成的:

# This example is valid in per-directory context only
RewriteCond "%{REQUEST_URI}"   "!-U"
RewriteRule "^(.+)\.html$"          "/regenerate_page.cgi"   [PT,L]

-U運算符確定測試字串(在本例中為REQUEST_URI)是否為有效URL。它通過子請求來實現。如果此子請求失敗 - 也就是說,請求的資源不存在 - 此規則調用CGI程式/regenerate_page.cgi,它生成所請求的資源並將其保存到文檔目錄中,以便下次使用時 請求,可以提供靜態副本。

通過這種方式,可以以靜態形式提供不經常更新的文檔。如果需要刷新文檔,可以從文檔目錄中刪除它們,然後在下次請求時重新生成它們。

負載均衡

當希望使用mod_rewrite在多個伺服器之間隨機分配負載,如何實現?

解決辦法:

可使用RewriteMap和服務器列表來完成此任務。

RewriteEngine on
RewriteMap lb "rnd:/path/to/serverlist.txt"
RewriteRule "^/(.*)" "http://${lb:servers}/$1" [P,L]

serverlist.txt 將包含伺服器列表:

## serverlist.txt

servers one.example.com|two.example.com|three.example.com

注:如果希望某個特定伺服器獲得比其他伺服器更多的負載,請將其功能變數名稱添加到列表中多次。

結構化用戶

具有數千個用戶的一些站點使用結構化的homedir佈局,即每個homedir位於子目錄中,該子目錄以(例如)用戶名的第一個字元開始。所以,/~larry/anypath/home/l/larry/public_html/anypath/~waldo/anypath/home/w/waldo/public_html/anypath

解決辦法:

可使用以下規則集將波形符號URL擴展為上述佈局。

RewriteEngine on
RewriteRule   "^/~(([a-z])[a-z0-9]+)(.*)"  "/home/$2/$1/public_html$3"

上一篇: Apache URL重寫 下一篇: Apache認證和授權