本文將補充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"