基于名称的虚拟主机和基于IP的虚拟主机的对比
基于IP的虚拟主机使用连接的IP地址来识别(区分)正确的虚拟主机,所以对于每一个虚拟主机,你都需要有独立的IP地址。
基于名称的虚拟主机,服务器依赖于客户端报告的HTTP headers中的hostname。基于这个技术,许多不同的主机可以共享同一个IP地址。
基于名称的虚拟主机通常来说更简单,因为你只需要配置你的DNS服务,让每一个hostname和正确的IP地址相匹配,然后配置Apache去识别不同的hostname。基于名称的虚拟主机也有助于缓解IP地址越来越少的局面。除非你正在使用的设备明确要求基于IP的虚拟主机,你都应该使用基于名称的虚拟主机。历史原因使得基于客户端支持的基于IP的虚拟主机不再适用于多功能的web服务器。
Apache如何选择正确的基于名称的虚拟主机?
必须承认,基于名称的虚拟主机解析的第一步就是基于IP的解析。在筛选了最好的基于IP的候选匹配之后,基于名称的虚拟主机的解析只选择最合适的基于名称的虚拟主机。在虚拟主机指令里对IP地址使用通配符(*)使得基于IP的映射变得无关紧要(
当一个请求到达时,服务器在请求的IP地址和端口号的基础上,会找出最好的(大多数特征)匹配
对于基于名称的虚拟主机,如果你忽略了ServerName指令,服务器将会根据系统的hostname为ServerName生成一个“完全限定域名(FQDN)”作为默认值。这种隐藏式地设置ServerName可能导致与正常预期相反的虚拟主机匹配,不推荐这样做。
如果在设置的虚拟主机的集合中没有找到相匹配的ServerName或者ServerAlias,那么将会使用集合中的第一个虚拟主机。
使用基于名称的虚拟主机
第一步是为每一个不同的host创建一个
Main host将不再起作用
如果一个请求不匹配任何现有的
当你在向一个服务器添加一个基于名称的虚拟主机时,并且这个虚拟主机参数匹配已存在的IP和端口号组合,那么请求将被唯一的虚拟主机处理。在这种情况下,创建一个ServerName匹配base server的default virtual host通常来说是明智的选择。在相同的接口和端口上的新域名,但是请求对立的配置,可以被添加为子(subsequent)虚拟主机(non-default)。
ServerName继承性
最好总是在每一个基于名称的虚拟主机中明确地列出ServerName。
如果一个虚拟主机没有指定ServerName,那么ServerName将会继承base server 的配置。如果没有指定全局server name,那么将会使用启动时第一个监听的地址反向DNS解析所得的IP地址。其他情况下,继承ServerName将会影响基于名称的虚拟主机解析,所以最好是在每一个基于名称的虚拟主机中总是指定ServerName。
例如:假设你的域名是www.example.com,并且你希望添加虚拟主机other.example.com并指向相同的IP地址。你可以简单地在http.conf添加如下代码:
1 2 3 4 5 6 | <VirtualHost *:80> # This first-listed virtual host is also the default for *:80 ServerName www.example.com ServerAlias example.com DocumentRoot "/www/domain" </VirtualHost> |
1 2 3 4 | <VirtualHost *:80> ServerName other.example.com DocumentRoot "/www/otherdomain" </VirtualHost> |
你可以使用显示的IP来代替
许多服务器都有处理多个名称需求,通过在
1 2 3 4 5 6 | <VirtualHost *:80> # This first-listed virtual host is also the default for *:80 ServerName www.example.com ServerAlias example.com *.example.com DocumentRoot "/www/domain" </VirtualHost> |
这样,所有请求example.com域名的请求都将会被www.example.com虚拟主机处理。通配符*和?可以用来匹配名称。当然,这些都基于你的DNS服务能正确地将名称、IP地址和你的服务器相关联。
基于名称的虚拟主机对于最匹配的
在VirtualHost指令中的完整的名称,相当于一个没有通配符的ServerAlias。
最后,你可以在