“基于名称”的虚拟主机支持

这个文档描述了什么时候和怎么使用“基于名称”的虚拟主机

一、“基于名称”和“基于IP”的虚拟主机

基于IP的主机是根据连接IP地址来决定正确的虚拟主机来服务。因此你需要一个独立的IP地址来对应主机。

对于基于名称的虚拟主机,服务器依赖于客户端在HTTP头中报告的主机名称。使用这种技术,不同的主机能够共享一个IP地址。

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

二、服务器如何选择正确的基于名称的虚拟主机

重要的是要认识到基于名称的虚拟主机解析的第一步是基于IP的解决方案。 基于名称的虚拟主机解析仅在将候选者缩小到最佳基于IP的匹配后才选择最适合的基于名称的虚拟主机。 在所有虚拟主机指令中使用通配符(*)作为IP地址,这使得基于IP的映射无关。

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

如果您从任何基于名称的虚拟主机中省略ServerName指令,则服务器将默认为从系统主机名派生的完全限定域名(FQDN)。这种隐含设置的服务器名称可能导致反直觉的虚拟主机匹配,并且不鼓励。

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

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

三、使用基于名称的虚拟主机

第一步是为您的每一个不同的主机创建一个<VirtualHost>块。 在每个<VirtualHost>块中,您将至少需要一个ServerName指令来指定提供哪个主机,并使用DocumentRoot指令来显示文件系统中该主机的内容的何处。

例如,假设您正在为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地址代替<VirtualHost>指令中的*。 例如,您可能需要这样做,以便在一个IP地址上运行一些基于名称的虚拟主机,以及在另一个IP地址上运行基于IP或另一组基于名称的虚拟主机。

许多服务器希望通过多个名称访问。 这可以通过ServerAlias指令放在<VirtualHost>部分中。 例如,在上面的第一个<VirtualHost>块中,ServerAlias指令指示列出的名称是人们可以用来查看同一网站的其他名称:

ServerAlias example.com *.example.com

然后,请求example.com域中的所有主机将由www.example.com虚拟主机提供。 通配符*和? 可以用来匹配名字。 当然,您不能仅仅填写名称并将其放在ServerName或ServerAlias中。 您必须先将DNS服务器正确配置为将这些名称映射到与服务器关联的IP地址。

最佳匹配的<virtualhost>集合的基于名称的虚拟主机按照配置中显示的顺序进行处理。 使用第一个匹配的ServerName或ServerAlias,通配符的优先级也不同(对于ServerName与ServerAlias也不同)。

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

最后,您可以通过在<VirtualHost>容器中放置其他指令来微调虚拟主机的配置。 大多数指令可以放在这些容器中,然后更改相关虚拟主机的配置。 要查看是否允许特定的指令,请检查指令的上下文。 在主服务器上下文(任何<VirtualHost>容器之外)中设置的配置指令只有在虚拟主机设置不被覆盖时才会被使用。

如果用了WSGI,例如python apache django环境中,可以在virtualhost中包括:WSGIScriptAlias / "/var/www/html/example.com/django.wsgi"

如果同时使用了SSL,就需要在ssl.conf中做相应的配置。

ps:

翻译:http://httpd.apache.org/docs/2.4/vhosts/name-based.html

fine-tune:微调

原文地址:https://www.cnblogs.com/ekse/p/6945182.html