我想知道“默认:*” 和 “*:*”在 VirtualHost 上下文中。
<VirtualHost _default_:*>
#...
ServerName host.example.com
#...
</VirtualHost>
<VirtualHost *:*>
#...
ServerName host.example.com
#...
</VirtualHost>
我不知道它们的区别和用途。
谢谢
答案1
解决方案请参阅 Apache 2.2 文档在 Virtualhost 指令上:
语法:...(...)Addr 可以是:
- 虚拟主机的IP地址;
- 虚拟主机 IP 地址的完全限定域名(不推荐);
- 人物 *,仅与名称虚拟主机* 匹配所有 IP 地址;或
- 字符串 _default_,仅用于IP虚拟主机捕获不匹配的 IP 地址。
存在两种处理虚拟主机的方式:基于名称的虚拟主机和基于 IP 的虚拟主机。
使用基于名称的虚拟主机,您将获得一个虚拟主机列表,每个虚拟主机管理一个或多个域名,并且每个虚拟主机都与一对域名相关联listening IP:port
。*
是一个特殊值,这意味着此主机上的所有 IP。默认的 virtualHost 是此列表中为每个给定的监听地址声明的第一个虚拟主机。
对于基于 IP 的 VirtualHosts,ServerName
不使用 VirtualHost 指令,重要的信息是监听的 IP(和端口),默认 VirtualHost 是第一个匹配处理传入请求的 IP 的 VirtualHost。
因此,使用基于命名的虚拟主机配置:
<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 _default_:*> with Servername foo.com
:不应与基于名称的虚拟主机一起使用
在基于 IP 的虚拟主机上:
<Virtualhost 10.0.0.2:*>
意思是“我将使用此虚拟主机来处理来自 10.0.0.2 接口的请求”<Virtualhost _default_:443>
意思是“我将使用这个虚拟主机来处理我主机上所有其他网络接口的 443 端口请求”<Virtualhost _default_:*>
意思是“如果与上一条规则不匹配,并且请求主机头与基于命名的虚拟主机不匹配,我将把这个虚拟主机用于主机上的所有其他网络接口”
因此,一切都围绕定义一个万能的虚拟主机展开。文档补充道:
_default_
使用基于 IP 的虚拟主机时,可以指定特殊名称,在这种情况下,此虚拟主机将匹配未在另一个虚拟主机中明确列出的任何 IP 地址。在没有任何_default_
虚拟主机的情况下,当没有发生 IP 匹配时,将使用“主”服务器配置(由任何 VirtualHost 部分之外的所有定义组成)。(但请注意,与 NameVirtualHost 指令匹配的任何 IP 地址都不会使用“主”服务器配置或_default_
虚拟主机。有关更多详细信息,请参阅基于名称的虚拟主机文档。)
因此,在经历了所有这些事情之后,我们“清楚地”认识到,混合基于 IP 和基于名称的虚拟主机可能会变得一团糟。在 Apache 2.2 中,仅当NameVirtualhost <something>
使用时才使用基于名称的虚拟主机。
但有了新的Apache 2.4版本这些东西确实更容易理解,无需NameVirtualhost
声明。NameVirtualHost 指令不再有任何作用,除了发出警告。出现在多个虚拟主机中的任何地址/端口组合都被隐式视为基于名称的虚拟主机。不再有复杂的想法,甚至文档现在也更简单了:
- 字符 * 充当通配符,可匹配任何 IP 地址。
- 字符串
_default_
,是 * 的别名
因此,对于 apache 2.4,答案是,这是同一件事。
答案2
_default_
所有端口的虚拟主机
捕获对任何未指定的 IP 地址和端口的每个请求,即未用于任何其他虚拟主机的地址/端口组合。
http://httpd.apache.org/docs/2.2/vhosts/examples.html#default