# 基于主機名的虛擬主機
本文檔說明了如何使用基于域名的虛擬主機。
## 基于域名的虛擬主機和基于IP的虛擬主機比較
基于IP的虛擬主機使用連接的IP地址來決定相應的虛擬主機。這樣,你就需要為每個虛擬主機分配一個獨立的IP地址。而基于域名的虛擬主機是根據客戶端提交的HTTP頭中標識主機名的部分決定的。使用這種技術,很多虛擬主機可以共享同一個IP地址。
基于域名的虛擬主機相對比較簡單,因為你只需要配置你的DNS服務器將每個主機名映射到正確的IP地址,然后配置Apache HTTP服務器,令其辨識不同的主機名就可以了。基于域名的服務器也可以緩解IP地址不足的問題。所以,如果沒有特殊原因使你必須使用基于IP的虛擬主機,您最好還是使用基于域名的虛擬主機。下列情況下,你可能會想要使用基于IP的虛擬主機:
* 一些古董級的客戶端與基于域名的虛擬主機不兼容。為了與基于域名的虛擬主機兼容,客戶端必須發送"Host"頭。HTTP/1.1規范中對此做了要求。而所有現在常見的僅支持HTTP/1.0的舊版本瀏覽器都以附加的方式實現了這個要求。如果你又想支持這些老瀏覽器,又想使用基于域名的虛擬主機。我們提供了一個技術方案,你可以在本文末尾看到它。
* SSL協議先天特性決定了基于域名的虛擬主機無法成為SSL安全服務器。
* 一些操作系統和網絡設備實現的帶寬管理技術無法在多個主機共享一個IP的情況下區別它們。
## 使用基于域名的虛擬主機
相關模塊
* `core`
相關指令
* `DocumentRoot`
* `NameVirtualHost`
* `ServerAlias`
* `ServerName`
* `ServerPath`
* `<VirtualHost>`
為了使用基于域名的虛擬主機,你必須指定服務器IP地址(和可能的端口)來使主機接受請求,這個可以用`NameVirtualHost`指令來進行配置。如果服務器上所有的IP地址都會用到,你可以用"`*`"作為`NameVirtualHost`的參數。如果你打算使用多端口(如運行SSL)你必須在參數中指定一個端口號,比如"`*:80`"。請注意,在`NameVirtualHost`指令中指定IP地址并不會使服務器自動偵聽那個IP地址。請參閱[設置Apache使用的地址和端口](#calibre_link-254)一章獲取更多詳情。另外,這里設定的IP地址必須對應服務器上的一個網絡接口。
下一步就是為每個虛擬主機建立`<VirtualHost>`段。`<VirtualHost>`的參數與`NameVirtualHost`的參數必須是一樣的(比如說,一個IP地址或"`*`"代表的所有地址)。在每個`<VirtualHost>`段中,至少要有一個`ServerName`指令來指定伺服哪個主機和一個`DocumentRoot`指令來說明這個主機的內容位于文件系統的什么地方。
### 取消中心主機(Mainhost)
如果你想在現有的web服務器上增加虛擬主機,你必須也為現存的主機建造一個`<VirtualHost>`定義塊。這個虛擬主機中`ServerName`和`DocumentRoot`所包含的內容應該與全局的`ServerName`和`DocumentRoot`保持一致。還要把這個虛擬主機放在配置文件的最前面,來讓它扮演默認主機的角色。
比如說,假設你正在為域名`www.domain.tld`提供服務,而你又想在同一個IP地址上增加一個名叫`www.otherdomain.tld`的虛擬主機,你只需在`httpd.conf`中加入以下內容:
```
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的或是另外一套基于域名的虛擬主機。
很多服務器希望自己能通過不只一個域名被訪問。我們可以把`ServerAlias`指令放入`<VirtualHost>`小節中來解決這個問題。比如說在上面的第一個`<VirtualHost>`配置段中`ServerAlias`指令中列出的名字就是用戶可以用來訪問同一個web站點的其它名字:
```
ServerAlias domain.tld *.domain.tld
```
這樣,所有對域`domain.tld`的訪問請求都將由虛擬主機`www.domain.tld`處理。通配符標記"`*`"和"`?`"可以用于域名的匹配。當然你不能僅僅搞個名字然后把它放到`ServerName`或`ServerAlias`里就算完了。你必須先在你的DNS服務器上進行配置,將這些名字和您服務器上的一個IP地址建立映射關系。
最后,你可以把其他一些指令放入`<VirtualHost>`段中,以更好的配置一個虛擬主機。大部分指令都可以放入這些`<VirtualHost>`段中以改變相應虛擬主機配置。如果您想了解一個特定的指令是否可以這樣運用,請參見指令的[作用域](#calibre_link-20)。_主服務器(main server)_范圍內的配置指令(在所有`<VirtualHost>`配置段之外的指令)僅在它們沒有被虛擬主機的配置覆蓋時才起作用。
這樣,當一個請求到達的時候,服務器會首先檢查它是否使用了一個能和`NameVirtualHost`相匹配的IP地址。如果能夠匹配,它就會查找每個與這個IP地址相對應的`<VirtualHost>`段,并嘗試找出一個與請求的主機名相同的`ServerName`或`ServerAlias`配置項。如果找到了,它就會使用這個服務器。否則,將使用符合這個IP地址的**第一個列出的虛擬主機**。
綜上所述,第一個列出的虛擬主機充當了_默認虛擬主機_的角色。當一個IP地址與`NameVirtualHost`指令中的配置相符的時候,_主服務器_中的`DocumentRoot`將**永遠不會**被用到。所以,如果你想創建一段特殊的配置用于處理不對應任何一個虛擬主機的請求的話,你只要簡單的把這段配置放到`<VirtualHost>`段中,并把它放到配置文件的最前面就可以了。
## 與舊版瀏覽器的兼容性
前面提過,有些瀏覽器無法對基于域名的虛擬主機發送必要的數據,從而使其無法正常工作。這些瀏覽器將會收到由配置中符合那個IP地址的第一個列出的虛擬主機發出的頁面(基于域名的<cite class="calibre27">主虛擬主機</cite>)。
### 究竟什么算舊?
請注意,當我們說到舊的時候,我們并不是真的說它們很古老。其實現實中您未必就能用上這些瀏覽器。現在幾乎所有的瀏覽器都會發送基于域名的虛擬主機所必須的`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/`的形式為所有的瀏覽器所訪問。能夠發送"`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`")。
完成這些可能需要一些嘗試,但遵照上述指導將會確保你的頁面能夠為所有的瀏覽器所正確顯示,不論新舊。
- Apache HTTP Server Version 2.2 文檔 [最后更新:2006年3月21日]
- 版本說明
- 從1.3升級到2.0
- 從2.0升級到2.2
- Apache 2.2 新特性概述
- Apache 2.0 新特性概述
- The Apache License, Version 2.0
- 參考手冊
- 編譯與安裝
- 啟動Apache
- 停止和重啟
- 配置文件
- 配置段(容器)
- 緩沖指南
- 服務器全局配置
- 日志文件
- 從URL到文件系統的映射
- 安全方面的提示
- 動態共享對象(DSO)支持
- 內容協商
- 自定義錯誤響應
- 地址和端口的綁定(Binding)
- 多路處理模塊
- Apache的環境變量
- Apache處理器的使用
- 過濾器(Filter)
- suEXEC支持
- 性能方面的提示
- URL重寫指南
- Apache虛擬主機文檔
- 基于主機名的虛擬主機
- 基于IP地址的虛擬主機
- 大批量虛擬主機的動態配置
- 虛擬主機示例
- 深入研究虛擬主機的匹配
- 文件描述符限制
- 關于DNS和Apache
- 常見問題
- 經常問到的問題
- Apache的SSL/TLS加密
- SSL/TLS高強度加密:緒論
- SSL/TLS高強度加密:兼容性
- SSL/TLS高強度加密:如何...?
- SSL/TLS Strong Encryption: FAQ
- 如何.../指南
- 認證、授權、訪問控制
- CGI動態頁面
- 服務器端包含入門
- .htaccess文件
- 用戶網站目錄
- 針對特定平臺的說明
- 在Microsoft Windows中使用Apache
- 在Microsoft Windows上編譯Apache
- Using Apache With Novell NetWare
- Running a High-Performance Web Server on HPUX
- The Apache EBCDIC Port
- 服務器和支持程序
- httpd - Apache超文本傳輸協議服務器
- ab - Apache HTTP服務器性能測試工具
- apachectl - Apache HTTP服務器控制接口
- apxs - Apache 擴展工具
- configure - 配置源代碼樹
- dbmmanage - 管理DBM格式的用戶認證文件
- htcacheclean - 清理磁盤緩沖區
- htdbm - 操作DBM密碼數據庫
- htdigest - 管理用于摘要認證的用戶文件
- httxt2dbm - 生成RewriteMap指令使用的dbm文件
- htpasswd - 管理用于基本認證的用戶文件
- logresolve - 解析Apache日志中的IP地址為主機名
- rotatelogs - 滾動Apache日志的管道日志程序
- suexec - 在執行外部程序之前切換用戶
- 其他程序
- 雜項文檔
- 與Apache相關的標準
- Apache模塊
- 描述模塊的術語
- 描述指令的術語
- Apache核心(Core)特性
- Apache MPM 公共指令
- Apache MPM beos
- Apache MPM event
- Apache MPM netware
- Apache MPM os2
- Apache MPM prefork
- Apache MPM winnt
- Apache MPM worker
- Apache模塊 mod_actions
- Apache模塊 mod_alias
- Apache模塊 mod_asis
- Apache模塊 mod_auth_basic
- Apache模塊 mod_auth_digest
- Apache模塊 mod_authn_alias
- Apache模塊 mod_authn_anon
- Apache模塊 mod_authn_dbd
- Apache模塊 mod_authn_dbm
- Apache模塊 mod_authn_default
- Apache模塊 mod_authn_file
- Apache模塊 mod_authnz_ldap
- Apache模塊 mod_authz_dbm
- Apache模塊 mod_authz_default
- Apache模塊 mod_authz_groupfile
- Apache模塊 mod_authz_host
- Apache模塊 mod_authz_owner
- Apache模塊 mod_authz_user
- Apache模塊 mod_autoindex
- Apache模塊 mod_cache
- Apache模塊 mod_cern_meta
- Apache模塊 mod_cgi
- Apache模塊 mod_cgid
- Apache模塊 mod_charset_lite
- Apache模塊 mod_dav
- Apache模塊 mod_dav_fs
- Apache模塊 mod_dav_lock
- Apache模塊 mod_dbd
- Apache模塊 mod_deflate
- Apache模塊 mod_dir
- Apache模塊 mod_disk_cache
- Apache模塊 mod_dumpio
- Apache模塊 mod_echo
- Apache模塊 mod_env
- Apache模塊 mod_example
- Apache模塊 mod_expires
- Apache模塊 mod_ext_filter
- Apache模塊 mod_file_cache
- Apache模塊 mod_filter
- Apache模塊 mod_headers
- Apache模塊 mod_ident
- Apache模塊 mod_imagemap
- Apache模塊 mod_include
- Apache模塊 mod_info
- Apache模塊 mod_isapi
- Apache模塊 mod_ldap
- Apache模塊 mod_log_config
- Apache模塊 mod_log_forensic
- Apache模塊 mod_logio
- Apache模塊 mod_mem_cache
- Apache模塊 mod_mime
- Apache模塊 mod_mime_magic
- Apache模塊 mod_negotiation
- Apache模塊 mod_nw_ssl
- Apache模塊 mod_proxy
- Apache模塊 mod_proxy_ajp
- Apache模塊 mod_proxy_balancer
- Apache模塊 mod_proxy_connect
- Apache模塊 mod_proxy_ftp
- Apache模塊 mod_proxy_http
- Apache模塊 mod_rewrite
- Apache模塊 mod_setenvif
- Apache模塊 mod_so
- Apache模塊 mod_speling
- Apache模塊 mod_ssl
- Apache模塊 mod_status
- Apache模塊 mod_suexec
- Apache模塊 mod_unique_id
- Apache模塊 mod_userdir
- Apache模塊 mod_usertrack
- Apache模塊 mod_version
- Apache模塊 mod_vhost_alias
- Developer Documentation for Apache 2.0
- Apache 1.3 API notes
- Debugging Memory Allocation in APR
- Documenting Apache 2.0
- Apache 2.0 Hook Functions
- Converting Modules from Apache 1.3 to Apache 2.0
- Request Processing in Apache 2.0
- How filters work in Apache 2.0
- Apache 2.0 Thread Safety Issues
- 詞匯和索引
- 詞匯表
- 指令索引
- 指令速查
- 模塊索引
- 站點導航