Apache HTTP Server 版本2.2

本文檔說明了如何使用基于域名的虛擬主機。
基于IP的虛擬主機使用連接的IP地址來決定相應(yīng)的虛擬主機。這樣,你就需要為每個虛擬主機分配一個獨立的IP地址。而基于域名的虛擬主機是根據(jù)客戶端提交的HTTP頭中標識主機名的部分決定的。使用這種技術(shù),很多虛擬主機可以共享同一個IP地址。
基于域名的虛擬主機相對比較簡單,因為你只需要配置你的DNS服務(wù)器將每個主機名映射到正確的IP地址,然后配置Apache HTTP服務(wù)器,令其辨識不同的主機名就可以了。基于域名的服務(wù)器也可以緩解IP地址不足的問題。所以,如果沒有特殊原因使你必須使用基于IP的虛擬主機,您最好還是使用基于域名的虛擬主機。下列情況下,你可能會想要使用基于IP的虛擬主機:
| 相關(guān)模塊 | 相關(guān)指令 |
|---|---|
為了使用基于域名的虛擬主機,你必須指定服務(wù)器IP地址(和可能的端口)來使主機接受請求,這個可以用NameVirtualHost指令來進行配置。如果服務(wù)器上所有的IP地址都會用到,你可以用"*"作為NameVirtualHost的參數(shù)。如果你打算使用多端口(如運行SSL)你必須在參數(shù)中指定一個端口號,比如"*:80"。請注意,在NameVirtualHost指令中指定IP地址并不會使服務(wù)器自動偵聽那個IP地址。請參閱設(shè)置Apache使用的地址和端口一章獲取更多詳情。另外,這里設(shè)定的IP地址必須對應(yīng)服務(wù)器上的一個網(wǎng)絡(luò)接口。
下一步就是為每個虛擬主機建立<VirtualHost>段。<VirtualHost>的參數(shù)與NameVirtualHost的參數(shù)必須是一樣的(比如說,一個IP地址或"*"代表的所有地址)。在每個<VirtualHost>段中,至少要有一個ServerName指令來指定伺服哪個主機和一個DocumentRoot指令來說明這個主機的內(nèi)容位于文件系統(tǒng)的什么地方。
如果你想在現(xiàn)有的web服務(wù)器上增加虛擬主機,你必須也為現(xiàn)存的主機建造一個<VirtualHost>定義塊。這個虛擬主機中ServerName和DocumentRoot所包含的內(nèi)容應(yīng)該與全局的ServerName和DocumentRoot保持一致。還要把這個虛擬主機放在配置文件的最前面,來讓它扮演默認主機的角色。
比如說,假設(shè)你正在為域名www.domain.tld提供服務(wù),而你又想在同一個IP地址上增加一個名叫www.otherdomain.tld的虛擬主機,你只需在httpd.conf中加入以下內(nèi)容:
NameVirtualHost *:80
<VirtualHost *:80>
ServerName www.domain.tld
ServerAlias domain.tld *.domain.tld
DocumentRoot /www/domain
</VirtualHost>
<VirtualHost *:80>
ServerName www.otherdomain.tld
DocumentRoot /www/otherdomain
</VirtualHost>
當然,你可以用一個固定的IP地址來代替NameVirtualHost和<VirtualHost>指令中的"*"號,以達到一些特定的目的。比如說,你可能會希望在一個IP地址上運行一個基于域名的虛擬主機,而在另外一個IP地址上運行一個基于IP的或是另外一套基于域名的虛擬主機。
很多服務(wù)器希望自己能通過不只一個域名被訪問。我們可以把ServerAlias指令放入<VirtualHost>小節(jié)中來解決這個問題。比如說在上面的第一個<VirtualHost>配置段中ServerAlias指令中列出的名字就是用戶可以用來訪問同一個web站點的其它名字:
ServerAlias domain.tld *.domain.tld
這樣,所有對域domain.tld的訪問請求都將由虛擬主機www.domain.tld處理。通配符標記"*"和"?"可以用于域名的匹配。當然你不能僅僅搞個名字然后把它放到ServerName或ServerAlias里就算完了。你必須先在你的DNS服務(wù)器上進行配置,將這些名字和您服務(wù)器上的一個IP地址建立映射關(guān)系。
最后,你可以把其他一些指令放入<VirtualHost>段中,以更好的配置一個虛擬主機。大部分指令都可以放入這些<VirtualHost>段中以改變相應(yīng)虛擬主機配置。如果您想了解一個特定的指令是否可以這樣運用,請參見指令的作用域。主服務(wù)器(main server)范圍內(nèi)的配置指令(在所有<VirtualHost>配置段之外的指令)僅在它們沒有被虛擬主機的配置覆蓋時才起作用。
這樣,當一個請求到達的時候,服務(wù)器會首先檢查它是否使用了一個能和NameVirtualHost相匹配的IP地址。如果能夠匹配,它就會查找每個與這個IP地址相對應(yīng)的<VirtualHost>段,并嘗試找出一個與請求的主機名相同的ServerName或ServerAlias配置項。如果找到了,它就會使用這個服務(wù)器。否則,將使用符合這個IP地址的第一個列出的虛擬主機。
綜上所述,第一個列出的虛擬主機充當了默認虛擬主機的角色。當一個IP地址與NameVirtualHost指令中的配置相符的時候,主服務(wù)器中的DocumentRoot將永遠不會被用到。所以,如果你想創(chuàng)建一段特殊的配置用于處理不對應(yīng)任何一個虛擬主機的請求的話,你只要簡單的把這段配置放到<VirtualHost>段中,并把它放到配置文件的最前面就可以了。
前面提過,有些瀏覽器無法對基于域名的虛擬主機發(fā)送必要的數(shù)據(jù),從而使其無法正常工作。這些瀏覽器將會收到由配置中符合那個IP地址的第一個列出的虛擬主機發(fā)出的頁面(基于域名的主虛擬主機)。
請注意,當我們說到舊的時候,我們并不是真的說它們很古老。其實現(xiàn)實中您未必就能用上這些瀏覽器,F(xiàn)在幾乎所有的瀏覽器都會發(fā)送基于域名的虛擬主機所必須的Host頭了。
雖然有點麻煩。但您還是有可能會用到ServerPath指令,以下是一個配置實例:
NameVirtualHost 111.22.33.44
<VirtualHost 111.22.33.44>
ServerName www.domain.tld
ServerPath /domain
DocumentRoot /web/domain
</VirtualHost>
以上這些說明了什么呢?它說明一個具有"/domain"開頭的任何URI都會為www.domain.tld這個虛擬主機所伺服。這意味著這個頁面可以由http://www.domain.tld/domain/的形式為所有的瀏覽器所訪問。能夠發(fā)送"Host:"頭的瀏覽器也能使用http://www.domain.tld/這種形式來訪問它。
為了達到這樣的目的。您先要在您的主虛擬主機的頁面上放一個到http://www.domain.tld/domain/的鏈接。然后,確保在虛擬主機的頁面中使用的全是相對鏈接(諸如:"file.html"或"../icons/image.gif")或者是包含/domain/這個前綴(比如:"http://www.domain.tld/domain/misc/file.html"或"/domain/misc/file.html")。
完成這些可能需要一些嘗試,但遵照上述指導(dǎo)將會確保你的頁面能夠為所有的瀏覽器所正確顯示,不論新舊。