基于IP的虚拟主机使用连接的IP地址来决定相应的虚拟主机。这样,你就需要为每个虚拟主机分配一个独立的IP地址。而基于域名的虚拟主机是根据客户端提交的HTTP头中标识主机名的部分决定的。使用这种技术,很多虚拟主机可以共享同一个IP地址。
基于域名的虚拟主机相对比较简单,因为你只需要配置你的DNS服务器将每个主机名映射到正确的IP地址,然后配置Apache HTTP服务器,令其辨识不同的主机名就可以了。基于域名的服务器也可以缓解IP地址不足的问题。所以,如果没有特殊原因使你必须使用基于IP的虚拟主机,您最好还是使用基于域名的虚拟主机。下列情况下,你可能会想要使用基于IP的虚拟主机:
- 一些古董级的客户端与基于域名的虚拟主机不兼容。为了与基于域名的虚拟主机兼容,客户端必须发送"Host"头。HTTP/1.1规范中对此做了要求。而所有现在常见的仅支持HTTP/1.0的旧版本浏览器都以附加的方式实现了这个要求。如果你又想支持这些老浏览器,又想使用基于域名的虚拟主机。我们提供了一个技术方案,你可以在本文末尾看到它。
- SSL协议先天特性决定了基于域名的虚拟主机无法成为SSL安全服务器。
- 一些操作系统和网络设备实现的带宽管理技术无法在多个主机共享一个IP的情况下区别它们。
前面提过,有些浏览器无法对基于域名的虚拟主机发送必要的数据,从而使其无法正常工作。这些浏览器将会收到由配置中符合那个IP地址的第一个列出的虚拟主机发出的页面(基于域名的主虚拟主机)。
究竟什么算旧?
请注意,当我们说到旧的时候,我们并不是真的说它们很古老。其实现实中您未必就能用上这些浏览器。现在几乎所有的浏览器都会发送基于域名的虚拟主机所必须的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")。
完成这些可能需要一些尝试,但遵照上述指导将会确保你的页面能够为所有的浏览器所正确显示,不论新旧。