<-
Apache > HTTP Server > 文件記錄 > 版本 2.4 > 虛擬主機

基於名稱的虛擬主機支援

可用的語言:  de  |  en  |  fr  |  ja  |  ko  |  tr 

此文件會說明何時以及如何使用基於名稱的虛擬主機。

Support Apache!

另見

top

基於名稱與基於 IP 的虛擬主機

基於 IP 的虛擬主機使用連線的 IP 位址判定要提供服務的正確虛擬主機。因此您需要為每個主機準備一個獨立的 IP 位址。

在基於名稱的虛擬主機代管中,伺服器會依靠客戶端將主機名稱回報為 HTTP 標頭的一部分。使用這項技術,許多不同的主機都能共用同一個 IP 位址。

基於名稱的虛擬主機代管通常比較簡易,因為您只需要設定您的 DNS 伺服器才能將每個主機名稱對應到正確的 IP 位址,然後設定 Apache HTTP Server 讓它能辨識不同的主機名稱。基於名稱的虛擬主機代管也能減輕對稀有 IP 位址的需求。因此您應該使用基於名稱的虛擬主機代管,除非您使用的設備明定需要基於 IP 的代管。過去基於客戶端支援而產生的基於 IP 的虛擬主機代管原因對一般用途的網路伺服器而言已經不再適用。

基於名稱的虛擬主機代管來自基於 IP 的虛擬主機選取演算法,意指只會在擁有最佳 IP 位址的虛擬主機之間搜尋適當的伺服器名稱。

top

伺服器如何選出適當的基於名稱的虛擬主機

很重要的是要認清,以名稱為基礎的虛擬主機解析的第一個步驟是基於 IP 的解析。在將候選縮小到最佳基於 IP 的比對後,基於名稱的虛擬主機解析才會選出最合適的基於名稱的虛擬主機。在 VirtualHost 指令的所有指令中,將星號 ( *) 用於 IP 位址,會讓這個基於 IP 的對應變得無關緊要。

當請求到來時,伺服器會根據請求所使用的 IP 位址和埠,找出最相符的(最具體)<VirtualHost> 參數。如果有一個以上的虛擬主機包含這個最相符的位址和埠組合,Apache 會進一步比對請求中出現的伺服器名稱和 ServerNameServerAlias 指令。

如果您從任何基於名稱的虛擬主機中省略 ServerName 指令,伺服器會預設為從系統主機名稱衍生的完全限定網域名稱 (FQDN)。這個隱含設定的伺服器名稱可能會導致反直覺的虛擬主機配對,因此不建議您使用。

IP 和埠組合的預設基於名稱的 vhost

如果在包含最相符 IP 位址和埠組合的虛擬主機組中找不到相符的 ServerName 或 ServerAlias,則會使用符合該組的第一個虛擬主機。

top

使用基於名稱的虛擬主機

第一步是為每個您想要提供的不同主機建立 <VirtualHost> 區塊。在每個 <VirtualHost> 區塊中,您至少需要一個 ServerName 指令來指定提供哪個主機,以及一個 DocumentRoot 指令來說明檔案系統中該主機內容的位置。

主機已經消失

任何一個與現有的 <VirtualHost> 不相符的要求,都會由全域伺服器組態處理,而與主機名稱或 ServerName 無關。

當您替現有的伺服器新增一個基於名稱的虛擬主機,而且虛擬主機參數與先前存在的 IP 和埠組合相符時,請求就會由明確的虛擬主機處理。在這種情況下,通常建議建立一個 預設虛擬主機,它的 ServerName 與基本伺服器的 ServerName相符。然後,可以將同一介面和埠上,需要個別組態的新網域新增為後續(非預設)虛擬主機。

ServerName 繼承

最好在每個基於名稱的虛擬主機中明確列出一個 ServerName

如果一個 VirtualHost 沒有指定 ServerName,伺服器名稱將會繼承自基礎伺服器設定。如果沒有指定全域性的伺服器名稱,就會在啟動時透過反向 DNS 解析第一個監聽地址來偵測。在不論哪種情況下,這個繼承的伺服器名稱都會影響基於名稱的虛擬主機解析,因此最好在每個基於名稱的虛擬主機中明確列出一個 ServerName

舉例而言,假設你正在供應網域 www.example.com 而且你想要加入虛擬主機 other.example.com,它指向同一個 IP 地址。然後你只要在 httpd.conf 中加入下列指令碼

<VirtualHost *:80>
    # This first-listed virtual host is also the default for *:80
    ServerName www.example.com
    ServerAlias example.com 
    DocumentRoot "/www/domain"
</VirtualHost>

<VirtualHost *:80>
    ServerName other.example.com
    DocumentRoot "/www/otherdomain"
</VirtualHost>

你也可以在 <VirtualHost> 指令碼中的 * 處指定一個明確的 IP 地址。舉例來說,你可能想這麼做以便在一個 IP 地址上執行一些基於名稱的虛擬主機,在另一個地址執行基於 IP 的虛擬主機,或者執行另一組基於名稱的虛擬主機。

許多伺服器希望可以被多於一個名稱存取。這可以使用 ServerAlias 指令碼在 <VirtualHost> 區段內來達成。舉例而言,在上面的第一個 <VirtualHost> 區塊中,ServerAlias 指令碼表示這些列出的名稱是 אנשים可用的其他名稱用以檢視同一個網站

ServerAlias example.com *.example.com

然後,example.com 網域中所有主機的請求都將由 www.example.com 虛擬主機提供。萬用字元 *? 可用於比對名稱。當然,你不能只編造名稱並將其放在 ServerNameServerAlias 中。你必須先適當地設定你的 DNS 伺服器,以將這些名稱對應到與你的伺服器關聯的 IP 地址。

符合最佳 <virtualhost> 組合的基於名稱的虛擬主機會依其在設定中出現的順序來處理。會使用到第一個符合的 ServerNameServerAlias,而且萬用字元(或 ServerName 與 ServerAlias)之間的優先順序並無不同。

VirtualHost 指令碼中的完整名稱清單視同一個(非萬用字元)ServerAlias

最後,您可以在 <VirtualHost> 容器中放置其他指令,微調虛擬主機的設定。大多數指令都可以放置在這些容器中,然後將只變更相關虛擬主機的設定。若要找出特定的指令是否被允許,請查看指令的 Context。在主伺服器內容(任何 <VirtualHost> 容器外)中設定的設定指令將只在未被虛擬主機設定覆寫時使用。

可用的語言:  de  |  en  |  fr  |  ja  |  ko  |  tr 

top

留言

注意
此處並非問答區。張貼於此處的意見應為改善文件或伺服器方面的建議,且可能被我們的版主刪除,原因可能是這些意見已實作或被視為無效/離題。關於如何管理 Apache HTTP 伺服器的問題,請導向我們的 IRC 頻道 Libera.chat 的 #httpd,或發送至我們的 郵寄清單