Apache HTTP Server 版本 2.4
基於 IP 的虛擬主機使用連線的 IP 位址判定要提供服務的正確虛擬主機。因此您需要為每個主機準備一個獨立的 IP 位址。
在基於名稱的虛擬主機代管中,伺服器會依靠客戶端將主機名稱回報為 HTTP 標頭的一部分。使用這項技術,許多不同的主機都能共用同一個 IP 位址。
基於名稱的虛擬主機代管通常比較簡易,因為您只需要設定您的 DNS 伺服器才能將每個主機名稱對應到正確的 IP 位址,然後設定 Apache HTTP Server 讓它能辨識不同的主機名稱。基於名稱的虛擬主機代管也能減輕對稀有 IP 位址的需求。因此您應該使用基於名稱的虛擬主機代管,除非您使用的設備明定需要基於 IP 的代管。過去基於客戶端支援而產生的基於 IP 的虛擬主機代管原因對一般用途的網路伺服器而言已經不再適用。
基於名稱的虛擬主機代管來自基於 IP 的虛擬主機選取演算法,意指只會在擁有最佳 IP 位址的虛擬主機之間搜尋適當的伺服器名稱。
很重要的是要認清,以名稱為基礎的虛擬主機解析的第一個步驟是基於 IP 的解析。在將候選縮小到最佳基於 IP 的比對後,基於名稱的虛擬主機解析才會選出最合適的基於名稱的虛擬主機。在 VirtualHost 指令的所有指令中,將星號 ( *) 用於 IP 位址,會讓這個基於 IP 的對應變得無關緊要。
當請求到來時,伺服器會根據請求所使用的 IP 位址和埠,找出最相符的(最具體)<VirtualHost>
參數。如果有一個以上的虛擬主機包含這個最相符的位址和埠組合,Apache 會進一步比對請求中出現的伺服器名稱和 ServerName
及 ServerAlias
指令。
如果您從任何基於名稱的虛擬主機中省略 ServerName
指令,伺服器會預設為從系統主機名稱衍生的完全限定網域名稱 (FQDN)。這個隱含設定的伺服器名稱可能會導致反直覺的虛擬主機配對,因此不建議您使用。
如果在包含最相符 IP 位址和埠組合的虛擬主機組中找不到相符的 ServerName 或 ServerAlias,則會使用符合該組的第一個虛擬主機。
相關模組 | 相關指令 |
---|---|
第一步是為每個您想要提供的不同主機建立 <VirtualHost>
區塊。在每個 <VirtualHost>
區塊中,您至少需要一個 ServerName
指令來指定提供哪個主機,以及一個 DocumentRoot
指令來說明檔案系統中該主機內容的位置。
任何一個與現有的 <VirtualHost>
不相符的要求,都會由全域伺服器組態處理,而與主機名稱或 ServerName 無關。
當您替現有的伺服器新增一個基於名稱的虛擬主機,而且虛擬主機參數與先前存在的 IP 和埠組合相符時,請求就會由明確的虛擬主機處理。在這種情況下,通常建議建立一個 預設虛擬主機,它的 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
虛擬主機提供。萬用字元 *
和 ?
可用於比對名稱。當然,你不能只編造名稱並將其放在 ServerName
或 ServerAlias
中。你必須先適當地設定你的 DNS 伺服器,以將這些名稱對應到與你的伺服器關聯的 IP 地址。
符合最佳 <virtualhost>
組合的基於名稱的虛擬主機會依其在設定中出現的順序來處理。會使用到第一個符合的 ServerName
或 ServerAlias
,而且萬用字元(或 ServerName 與 ServerAlias)之間的優先順序並無不同。
在 VirtualHost
指令碼中的完整名稱清單視同一個(非萬用字元)ServerAlias
。
最後,您可以在 <VirtualHost>
容器中放置其他指令,微調虛擬主機的設定。大多數指令都可以放置在這些容器中,然後將只變更相關虛擬主機的設定。若要找出特定的指令是否被允許,請查看指令的 Context。在主伺服器內容(任何 <VirtualHost>
容器外)中設定的設定指令將只在未被虛擬主機設定覆寫時使用。