_default_:* 和 *:* 在 VirtualHost 上下文中的区别

Lui*_*ppe 45 tomcat httpd httpd.conf virtualhost apache-2.2

我想知道VirtualHost Context 中default :*”“*:*”之间的区别。

<VirtualHost _default_:*>
  #...
  ServerName host.example.com
  #...
</VirtualHost>

<VirtualHost *:*>
  #...
  ServerName host.example.com
  #...
</VirtualHost>
Run Code Online (Sandbox Code Playgroud)

我不知道区别和用途。

thk

reg*_*ero 52

解决方案是关于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。

因此,使用基于命名的虚拟主机配置:

  • <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_:*> 意思是“我将把这个虚拟主机用于我主机上的所有其他网络接口,如果它与之前的规则不匹配,并且请求主机标头与基于命名的虚拟主机不匹配”

所以这一切都是关于定义一个包罗万象的虚拟主机。文档补充说:

使用基于 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,答案是一样的


小智 0

_default_所有端口的虚拟主机

捕获对任何未指定的 IP 地址和端口(即未用于任何其他虚拟主机的地址/端口组合)的每个请求。

http://httpd.apache.org/docs/2.2/vhosts/examples.html#default