我想知道VirtualHost上下文中“ default:*” 和 “ *:*”之间的区别。
<VirtualHost _default_:*>
#...
ServerName host.example.com
#...
</VirtualHost>
<VirtualHost *:*>
#...
ServerName host.example.com
#...
</VirtualHost>
我不知道使用的区别和用途。
k
我想知道VirtualHost上下文中“ default:*” 和 “ *:*”之间的区别。
<VirtualHost _default_:*>
#...
ServerName host.example.com
#...
</VirtualHost>
<VirtualHost *:*>
#...
ServerName host.example.com
#...
</VirtualHost>
我不知道使用的区别和用途。
k
Answers:
解决方案是关于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,答案是一样的。
_default_
所有端口的虚拟主机
将每个请求捕获到任何未指定的IP地址和端口,即未用于任何其他虚拟主机的地址/端口组合。
http://httpd.apache.org/docs/2.2/vhosts/examples.html#default