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

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

我的开发工作站上的 apache.conf 中有以下内容(实际上包含在 /etc/apache2/users/andrew.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/~安德鲁/它不会尝试为标准目录索引提供服务,而是尝试为 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

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

更新 2:在 extra/httpd-vhosts.conf 文件中,我注释掉了指向不存在的 DocumentRoots 的“示例”VirtualHosts。通过重新添加这些示例,我的常规目录现在可以按预期工作,而不会落入第一个万能 VirtualHost 中。

所以,真正的问题是:为什么 apache 配置需要无效的 VirtualHost 才能工作?

答案1

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

在选择用于处理请求的虚拟主机时,Apache 的工作方式如下:

  1. 它通过匹配的 IP 地址和端口来过滤虚拟主机。
  2. 如果未找到匹配项,则使用默认的非虚拟主机。
  3. 如果找到一个匹配项,则使用它。
  4. 如果找到多个匹配项,则使用其中第一个在 ServerName 或 ServerAlias 中也匹配的匹配项。
  5. 如果找到多个匹配项,但随后无法在 ServerName 或 ServerAlias 中建立匹配,则使用 IP 地址和端口匹配的第一个虚拟主机。

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

解决方案是将主非虚拟主机更改为虚拟主机。<VirtualHost *:80>在主主机的 DocumentRoot 指令周围添加声明就足够了。

您可以在 Apache 文档中阅读更多内容基于名称的虚拟主机支持. 特别检查主要宿主消失笔记。

相关内容