<-
Apache HTTP 服务器 2.4 > 基于名称的虚拟主机

基于名称的虚拟主机支持

本文档介绍了何时以及如何使用基于名称的虚拟主机。

支持Apache!

也可以看看

最佳

基于名称和基于IP的虚拟主机

基于IP的虚拟主机使用连接的IP地址来确定要服务的正确虚拟主机。因此,每个主机都需要有一个单独的IP地址。

使用基于名称的虚拟主机时,服务器依靠客户端将主机名报告为HTTP标头的一部分。使用此技术,许多不同的主机可以共享相同的IP地址。

基于名称的虚拟主机通常更简单,因为您只需要配置DNS服务器以将每个主机名映射到正确的IP地址,然后配置Apache HTTP Server即可识别不同的主机名。基于名称的虚拟主机还可以缓解对稀缺IP地址的需求。因此,除非您使用的设备明确要求基于IP的托管,否则应使用基于名称的虚拟托管。基于客户端支持的基于IP的虚拟托管的历史原因不再适用于通用Web服务器。

基于名称的虚拟主机建立在基于IP的虚拟主机选择算法的基础上,这意味着仅在具有最佳基于IP的地址的虚拟主机之间搜索正确的服务器名称。

最佳

服务器如何选择适当的基于名称的虚拟主机

必须认识到,基于名称的虚拟主机解析的第一步是基于IP的解析。基于名称的虚拟主机解析仅在将候选范围缩小到最佳的基于IP的匹配之后才选择最合适的基于名称的虚拟主机。在所有VirtualHost指令中对IP地址使用通配符(*),使基于IP的映射无关紧要。

当请求到达时,服务器将<VirtualHost>根据请求使用的IP地址和端口找到最佳(最特定)匹配 参数。如果有多个包含此最佳匹配地址和端口组合的虚拟主机,Apache将进一步比较ServerNameServerAlias指令与请求中存在的服务器名称。

如果您ServerName 从任何基于名称的虚拟主机中省略该指令,则服务器将默认为从系统主机名派生的标准域名(FQDN)。隐式设置的服务器名称可能导致虚拟主机匹配违反直觉,因此不建议使用。

IP和端口组合的默认基于名称的虚拟主机

如果在包含最特定的匹配IP地址和端口组合的虚拟主机集中未找到匹配的ServerName或ServerAlias ,则将使用将与之匹配的第一个列出的虚拟主机

最佳

使用基于名称的虚拟主机

第一步是为<VirtualHost>您要服务的每个不同的主机创建一个块。在每个<VirtualHost>块内,您​​至少需要一个 ServerName指令来指定要服务的主机,并需要一个DocumentRoot 指令来显示该主机的内容在文件系统中的位置。

主主机消失

<VirtualHost>与主机不匹配的任何请求均由全局服务器配置处理,而不管主机名或服务器名如何。

当您将基于名称的虚拟主机添加到现有服务器时,并且虚拟主机参数与预先存在的IP和端口组合匹配时,请求现在将由显式虚拟主机处理。在这种情况下,创建 与基础服务器匹配的默认虚拟主机通常是明智的ServerName。然后,可以将位于同一接口和端口上但需要单独配置的新域添加为后续(非默认)虚拟主机。

ServerName继承

最好始终ServerName在每个基于名称的虚拟主机中明确列出a 。

如果VirtualHost未指定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>将按照它们在配置中出现的顺序进行处理。使用第一个匹配ServerNameServerAlias,通配符的优先级没有不同(服务器名和ServerAlias也不相同)。

VirtualHost 伪指令中名称的完整列表被视为(非通配符) ServerAlias

最后,您可以通过在<VirtualHost>容器中放置其他指令来微调虚拟主机的配置。大部分指令可以放在这些容器中,然后仅更改相关虚拟主机的配置。要了解是否允许使用特定指令,请检查指令的上下文。 仅在虚拟主机设置未覆盖在主服务器上下文 (在任何<VirtualHost>容器外部)中设置的配置指令时,才使用它们。

可用语言: de  |  zh  |  fr  |  ja  |  ko  |  TR 

最佳

注释

注意:
这不是“问答”部分。此处放置的评论应指向有关改进文档或服务器的建议,如果实施或被认为无效/偏离主题,我们的主持人可以将其删除。有关如何管理Apache HTTP Server的问题,应直接指向我们的IRC频道#httpd(位于Freenode上),或发送至我们的邮件列表
目前,此页面已禁用评论。