VirtualHost上下文中_default _:*和*:*之间的区别


Answers:


40

解决方案是关于Virtualhost指令的 Apache 2.2文档:

语法:...(...)Addr可以是:

  • 虚拟主机的IP地址;
  • 虚拟主机IP地址的标准域名(不建议);
  • 字符*,仅与NameVirtualHost * 结合使用以匹配所有IP地址;要么
  • 字符串_default_,仅与IP虚拟主机一起使用,以捕获不匹配的IP地址。

存在两种处理虚拟主机的方法,基于名称的虚拟主机和基于IP的虚拟主机。

使用基于命名的虚拟主机,您可以获得一个虚拟主机列表,每个虚拟主机管理一个或多个域名,每个虚拟主机与一对相关联listening IP:port*是一个特殊值,表示此主机上的所有IP。默认的virtualHost是此列表中每个给定侦听地址上第一个声明的虚拟主机。

对于基于IP的VirtualHosts,ServerName不使用VirtualHost的指令,重要的信息是侦听IP(和端口),默认的VirtualHost是与处理传入请求的IP匹配的第一个。

因此,使用基于命名的virtualhosting配置:

  • <Virtualhost *:80> with ServerName foo.com 表示“在此主机上管理的所有IP上”,“在端口80上”,“如果请求主机标头为foo.com”,我将使用此虚拟主机
  • <Virtualhost *:*> with Servername foo.com 表示“在此主机上管理的所有IP上”,“在所有端口上”,“如果请求主机标头为foo.com”,我将使用此虚拟主机
  • <Virtualhost 10.0.0.2:*> with Servername foo.com 表示“对于从我的网络接口10.0.0.2传入的请求”,“在所有端口上”,“如果请求主机标头是foo.com”,我将使用此virtualhost
  • <Virtualhost _default_:*> with Servername foo.com :不应与基于名称的虚拟主机一起使用

在基于IP的虚拟主机上:

  • <Virtualhost 10.0.0.2:*> 表示“我将使用此虚拟主机进行来自10.0.0.2接口的请求”
  • <Virtualhost _default_:443> 表示“我将将此虚拟主机用于主机上的所有其他网络接口,以请求来自端口443的请求”
  • <Virtualhost _default_:*> 表示“如果主机虚拟机与先前的规则不匹配,并且请求主机标头与基于命名的虚拟主机不匹配,我将在主机上的所有其他网络接口上使用此虚拟主机”

因此,这就是定义一个全面的Virtualhost的全部。文档添加:

使用基于IP的虚拟主机时,_default_可以指定特殊名称,在这种情况下,该虚拟主机将与另一个虚拟主机中未明确列出的IP地址匹配。在没有任何_default_虚拟主机的情况下,当没有IP匹配发生时,将使用“主”服务器配置,该配置由VirtualHost部分之外的所有那些定义组成。(但是请注意,任何与NameVirtualHost指令匹配的IP地址都将既不使用“主”服务器配置也不使用_default_虚拟主机。有关更多详细信息,请参阅基于名称的虚拟主机文档。)

因此,经过上述所有事情之后,很明显“混合”基于IP和基于名称的虚拟主机可能会变得一团糟。在Apache 2.2中,仅NameVirtualhost <something>在使用基于名称的虚拟主机时使用。

但是,使用新的Apache 2.4版本,这些事情真的很容易理解,无需NameVirtualhost声明。除了发出警告之外,NameVirtualHost指令不再具有任何作用。出现在多个虚拟主机中的任何地址/端口组合都被隐式视为基于名称的虚拟主机。不用再复杂了,甚至文档也变得更简单了:

  • 字符*,用作通配符并与任何IP地址匹配。
  • 字符串_default_,它是*的别名

因此,对于Apache 2.4,答案是一样的


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.