本文將補充mod_rewrite
參考文件。介紹使用mod_rewrite
提供的一些高階技術。
注意,許多這些範例在特定伺服器組態中不會保持不變,因此您必須了解它們,而不是僅僅將範例剪下並貼上到組態中。
分配伺服器負載或儲存空間負擔的常用技術稱為「分片」。使用此方法時,前端伺服器將使用該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"