VirtualHost接pipe目录,请求中没有主机名

我在我的开发工作站(实际上包含在/etc/apache2/users/andrew.conf中)的apache.conf中有以下内容:

<Directory "/Users/andrew/Sites/"> Options Indexes MultiViews AllowOverride All Order allow,deny Allow from all </Directory> <VirtualHost *:80> DocumentRoot /Users/andrew/Sites/mysite/public ServerName mysite.dev </VirtualHost> 

我依赖于新安装的Mac OS X Lion中的默认设置,并添加了VirtualHost指令。

当我得到http:// localhost /〜andrew /它不会尝试提供标准的目录索引,而是尝试服务于VirtualHost。 我期望这只会发生在ServerName“mysite.dev”访问它时。

如果我删除VirtualHost,它正确地服务目录索引。

任何想法,为什么这可能会发生?

更新:我发现如果我把VirtualHost指令从users / andrew.conf移到extra / http-vhosts.conf,那么它工作正常。 我想这回答我的问题,但是我还不清楚根本原因:

 ## httpd.conf Include /private/etc/apache2/extra/httpd-userdir.conf Include /private/etc/apache2/extra/httpd-vhosts.conf ## extra/http-userdir.conf UserDir Sites Include /private/etc/apache2/users/*.conf <IfModule bonjour_module> RegisterUserSite customized-users </IfModule> ## extra/httpd-vhosts.conf NameVirtualHost *:80 

configuration看起来应该仍然加载相同的东西,所以我不明白为什么我的VirtualHost是在extra / httpd-vhosts.conf或我自己的用户/ andrew.conf中定义的

更新2 :在extra / httpd-vhosts.conf文件中,我已经注释了指向不存在的DocumentRoot的“示例”VirtualHosts。 通过回顾这些例子,我的常规目录现在可以按照预期的方式工作,而不会陷入到第一个全面的虚拟主机中。

所以,真正的问题是:为什么Apacheconfiguration需要一个无效的VirtualHost这个工作?

只有与声明中指定的任何IP和端口不匹配的请求才由主非虚拟主机处理。

在select将用于提供请求的虚拟主机时,Apache以这种方式工作:

  1. 它过滤与匹配的IP地址和端口的虚拟主机。
  2. 如果找不到匹配项,则使用默认的非虚拟主机。
  3. 如果find一场比赛,那就用了。
  4. 如果find多个匹配项,则使用第一个匹配ServerName或ServerAlias的匹配项。
  5. 如果find多个匹配项,但随后可能无法build立ServerName或ServerAlias中的匹配项,则将使用与IP地址和端口匹配的第一个虚拟主机。

因此,如果在configuration中指定Listen 80<VirtualHost *:80>指令,则意味着不能使用非虚拟主机,因为我们侦听的所有内容都将被该虚拟主机捕获,即使该虚拟机上的ServerName主机不匹配,它仍然会按照我的规则5匹配。

解决scheme是将您的主要非虚拟主机变成虚拟主机。 在主要主机的DocumentRoot指令周围放置<VirtualHost *:80>声明应该足够了。

您可以在基于名称的虚拟主机支持的 Apache文档中了解更多信息。 特别是检查主人消失的笔记。