Apache URL重寫(高階部分)

2019-10-16 22:02:13

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