基于名称的虚拟主机 (每个 IP 多个站点)
服务器如何选择适当的基于名称的虚拟主机
必须认识到,基于名称的虚拟主机解析的第一步是基于IP的解析。基于名称的虚拟主机解析仅在将候选范围缩小到基于IP的最佳匹配之后才选择最合适的基于名称的虚拟主机。在所有VirtualHost指令中对IP地址使用通配符(*),使基于IP的映射无关紧要。
当请求到达时,服务器将<VirtualHost>
根据请求使用的IP地址和端口找到最佳(最特定)匹配参数。如果有多个包含此最佳匹配地址和端口组合的虚拟主机,Apache将进一步比较ServerName
和ServerAlias
指令与请求中存在的服务器名称。
如果您ServerName
从任何基于名称的虚拟主机中省略该指令,则服务器将默认为从系统主机名派生的标准域名(FQDN)。隐式设置的服务器名称可能导致虚拟主机匹配违反直觉的行为,因此不建议使用。
IP和端口组合的默认基于名称的虚拟主机
如果在包含最特定的匹配IP地址和端口组合的虚拟主机集中未找到匹配的ServerName或ServerAlias ,则将使用将与之匹配的第一个列出的虚拟主机。
使用基于名称的虚拟主机
相关模块 | 相关指令 |
---|---|
|
|
第一步是为<VirtualHost>
您要服务的每个不同的主机创建一个块。在每个<VirtualHost>
块内,您至少需要一个ServerName
指令来指定要服务的主机,并需要一个DocumentRoot
指令来显示该主机的内容在文件系统中的位置。
主主机消失
<VirtualHost>
与主机不匹配的任何请求均由全局服务器配置处理,而不管主机名或服务器名如何。
当您将基于名称的虚拟主机添加到现有服务器时,并且虚拟主机参数与预先存在的IP和端口组合匹配时,请求现在将由显式虚拟主机处理。在这种情况下,通常明智的做法是创建一个与基础服务器相匹配的默认虚拟主机ServerName
。然后可以将同一接口和端口上的新域,但需要单独配置,添加为后续(非默认)虚拟主机。
ServerName继承
最好始终ServerName
在每个基于名称的虚拟主机中明确列出a 。
如果VirtualHost
没有指定a ServerName
,则服务器名称将从基本服务器配置中继承。如果未全局指定服务器名称,则在启动时会通过对第一个侦听地址进行反向DNS解析来检测到服务器名称。无论哪种情况,此继承的服务器名称都会影响基于名称的虚拟主机解析,因此最好始终ServerName
在每个基于名称的虚拟主机中显式列出a 。
例如,假设您正在为域提供服务,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>
您也可以指定一个显式IP地址代替*
in <VirtualHost>
指令。例如,您可能想要执行此操作,以便在一个IP地址上运行某些基于名称的虚拟主机,而在另一个地址上运行基于IP的或另一组基于名称的虚拟主机。
许多服务器希望通过多个名称进行访问。使用ServerAlias
位于该<VirtualHost>
节内的指令可以做到这一点。例如,在<VirtualHost>
上面的第一个块中,该ServerAlias
指令指示列出的名称是其他名称,人们可以用来查看该网站:
ServerAlias example.com *.example.com
然后虚拟主机example.com
将为域中的所有主机提供请求www.example.com
。通配符*
和?
可以用于匹配名称。当然,您不能只是编造名称并将其放在ServerName
或中ServerAlias
。首先,必须正确配置DNS服务器,以将这些名称映射到与服务器关联的IP地址。
一组最匹配的基于名称的虚拟主机<virtualhost>
将按照它们在配置中出现的顺序进行处理。使用第一个匹配ServerName
或ServerAlias
,通配符的优先级没有不同(服务器名与ServerAlias也不相同)。
VirtualHost
伪指令中名称的完整列表被视为(非通配符)ServerAlias
。
最后,您可以通过在<VirtualHost>
容器内放置其他指令来微调虚拟主机的配置。大部分指令可以放在这些容器中,然后仅更改相关虚拟主机的配置。要了解是否允许使用特定指令,请检查指令的上下文。仅在虚拟主机设置未覆盖在主服务器上下文(在任何<VirtualHost>
容器外部)中设置的配置指令时,才使用它们。