Apache HTTP Server 第 2.4 版
說明 | 提供動態配置大量虛擬主機 |
---|---|
狀態 | 擴充 |
模組識別碼 | vhost_alias_module |
原始檔 | mod_vhost_alias.c |
此模組會建立動態配置的虛擬主機,方法是允許使用 HTTP 要求的 IP 位址和/或 Host:
標頭作為路徑名稱中的一部分,用來決定要提供哪些檔案。這樣可以輕鬆使用大量具有類似組態的虛擬主機。
如果 mod_alias
或 mod_userdir
用於將 URI 翻譯成檔案名稱,它們會覆寫以下所述的 mod_vhost_alias
指令。例如,以下組態會在所有情況下將 /cgi-bin/script.pl
映射到 /usr/local/apache2/cgi-bin/script.pl
ScriptAlias "/cgi-bin/" "/usr/local/apache2/cgi-bin/" VirtualScriptAlias "/never/found/%0/cgi-bin/"
此模組中的所有指令會在路徑名稱中內插字串。內插的字串(以下稱之為「名稱」)可能是伺服器名稱(請參閱 UseCanonicalName
指令,以了解如何決定名稱的詳細資訊)或用點分十進位格式表示的伺服器上虛擬主機的 IP 位址。內插由受 printf
啟發的指定元控制,這些指定元有數種格式
%% |
插入 % |
%p |
插入虛擬主機的埠號 |
%N.M |
插入名稱的(部分) |
N
和 M
用於指定名稱的子字串。N
從名稱中以句點分隔的組成元件中選取;而 M
則選取 N
選取的內容內的字元。M
是選用的,如果不存在則預設為零;只有在 M
存在時,句點必須存在。解譯如下
0 |
完整名稱 |
1 |
第一個部分 |
2 |
第二個部分 |
-1 |
最後一個部分 |
-2 |
倒數第二部分 |
2+ |
第二個和後續的所有部分 |
-2+ |
倒數第二和所有先前的部分 |
1+ 和 -1+ |
等同於 0 |
如果 N
或 M
大過於可用部分的數量,則會內插一個底線。
對於基於簡單名稱的虛擬主機,您可以在伺服器組態檔中使用下列指令
UseCanonicalName Off VirtualDocumentRoot "/usr/local/apache/vhosts/%0"
針對 http://www.example.com/directory/file.html
的請求,將會由檔案 /usr/local/apache/vhosts/www.example.com/directory/file.html
滿足。
對於非常大量的虛擬主機,建議您安排檔案以減小 vhosts
目錄的大小。為此,您可以在您的組態檔中使用下列指令
UseCanonicalName Off VirtualDocumentRoot "/usr/local/apache/vhosts/%3+/%2.1/%2.2/%2.3/%2"
針對 http://www.domain.example.com/directory/file.html
的請求,將會由檔案 /usr/local/apache/vhosts/example.com/d/o/m/domain/directory/file.html
滿足。
可以透過從名稱尾端雜湊的方式來達到檔案更平均的分布,例如
VirtualDocumentRoot "/usr/local/apache/vhosts/%3+/%2.-1/%2.-2/%2.-3/%2"
範例請求會來自 /usr/local/apache/vhosts/example.com/n/i/a/domain/directory/file.html
。
或者您也可以使用
VirtualDocumentRoot "/usr/local/apache/vhosts/%3+/%2.1/%2.2/%2.3/%2.4+"
範例請求會來自 /usr/local/apache/vhosts/example.com/d/o/m/ain/directory/file.html
。
使用者很常見的請求是能夠將多個網域指向多個文件根目錄,而不用擔心請求主機名稱的部分長度或數量。如果請求的主機名稱是 sub.www.domain.example.com
而非單純的 www.domain.example.com
,則使用 %3+ 會導致文件根目錄成為 /usr/local/apache/vhosts/domain.example.com/...
,而不是預期的 example.com
目錄。在這種情況下,使用組合 %-2.0.%-1.0
會很有幫助,它會總是產生網域名稱和頂層網域,例如 example.com
,無論主機名稱附加了多少個子網域。因此,可以進行組態,將所有第一、第二或第三層級的子網域導向同一個目錄
VirtualDocumentRoot "/usr/local/apache/vhosts/%-2.0.%-1.0"
在上述範例中,www.example.com
和 www.sub.example.com
或 example.com
都會指向 /usr/local/apache/vhosts/example.com
。
對於基於 IP 的虛擬主機,您可以在您的組態檔中使用下列指令
UseCanonicalName DNS VirtualDocumentRootIP "/usr/local/apache/vhosts/%1/%2/%3/%4/docs" VirtualScriptAliasIP "/usr/local/apache/vhosts/%1/%2/%3/%4/cgi-bin"
如果 www.domain.example.com
的 IP 位址是 10.20.30.40,則針對 http://www.domain.example.com/directory/file.html
的請求會由檔案 /usr/local/apache/vhosts/10/20/30/40/docs/directory/file.html
滿足。針對 http://www.domain.example.com/cgi-bin/script.pl
的請求會透過執行程式 /usr/local/apache/vhosts/10/20/30/40/cgi-bin/script.pl
滿足。
若要讓 .
字元包含在 VirtualDocumentRoot
指令中,但它與 %
指令衝突,您可使用下列方式來解決此問題。
VirtualDocumentRoot "/usr/local/apache/vhosts/%2.0.%3.0"
在 http://www.domain.example.com/directory/file.html
中的請求會由 /usr/local/apache/vhosts/domain.example/directory/file.html
檔案滿足。
%V
和 %A
等 LogFormat
指令相當適用於此模組。
說明 | 針對已建置的虛擬主機動態設定文件根目錄的位置 |
---|---|
語法 | VirtualDocumentRoot 內插目錄|none |
預設值 | VirtualDocumentRoot none |
內容 | 伺服器設定、虛擬主機 |
狀態 | 擴充 |
模組 | mod_vhost_alias |
VirtualDocumentRoot
指令讓您可以根據伺服器名稱的數值來確認 Apache HTTP Server 在何處尋找文件。擴充 內插目錄 的結果可用來當作文件結構的根目錄,類似於 DocumentRoot
指令引數。如果 內插目錄 為 none
,則會關閉 VirtualDocumentRoot
。此指令無法與 VirtualDocumentRootIP
使用在相同的內容中。
VirtualDocumentRoot
會覆寫任何您放入相同內容或子內容中的 DocumentRoot
指令。如果在全域伺服器範圍中放入 VirtualDocumentRoot
,會有效覆寫之後定義的任何虛擬主機中的 DocumentRoot
指令,除非您在各個虛擬主機中將 VirtualDocumentRoot
設定為 None
。說明 | 針對已建置的虛擬主機動態設定文件根目錄的位置 |
---|---|
語法 | VirtualDocumentRootIP 內插目錄|none |
預設值 | VirtualDocumentRootIP none |
內容 | 伺服器設定、虛擬主機 |
狀態 | 擴充 |
模組 | mod_vhost_alias |
VirtualDocumentRootIP
指令類似於 VirtualDocumentRoot
指令,不同點在於它會使用連線伺服器端的 IP 位址進行目錄內插,而非使用伺服器名稱。
說明 | 針對已建置的虛擬主機動態設定 CGI 目錄的位置 |
---|---|
語法 | VirtualScriptAlias 內插目錄|none |
預設值 | VirtualScriptAlias none |
內容 | 伺服器設定、虛擬主機 |
狀態 | 擴充 |
模組 | mod_vhost_alias |
VirtualScriptAlias
指令可讓您設定 Apache httpd 尋找 CGI 腳本的位置,其與 VirtualDocumentRoot
尋找其他文件的設定方式類似。它會比對從 /cgi-bin/
開始的 URI 要求,就像 ScriptAlias
/cgi-bin/
那樣。
說明 | 針對已建置的虛擬主機動態設定 CGI 目錄的位置 |
---|---|
語法 | VirtualScriptAliasIP 已內插目錄|無 |
預設值 | VirtualScriptAliasIP 無 |
內容 | 伺服器設定、虛擬主機 |
狀態 | 擴充 |
模組 | mod_vhost_alias |
VirtualScriptAliasIP
指令會像 VirtualScriptAlias
指令那樣,但它會改用連線伺服器端的 IP 位址來內插目錄,而非使用伺服器名稱。