我的开发工作站上的 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 的工作方式如下:
- 它通过匹配的 IP 地址和端口来过滤虚拟主机。
- 如果未找到匹配项,则使用默认的非虚拟主机。
- 如果找到一个匹配项,则使用它。
- 如果找到多个匹配项,则使用其中第一个在 ServerName 或 ServerAlias 中也匹配的匹配项。
- 如果找到多个匹配项,但随后无法在 ServerName 或 ServerAlias 中建立匹配,则使用 IP 地址和端口匹配的第一个虚拟主机。
因此,如果您在配置中指定Listen 80
和<VirtualHost *:80>
指令,则意味着不可能使用非虚拟主机,因为我们监听的所有内容都将被该虚拟主机捕获,即使该虚拟主机上的 ServerName 不匹配,它仍然会根据我的规则 5 与其匹配。
解决方案是将主非虚拟主机更改为虚拟主机。<VirtualHost *:80>
在主主机的 DocumentRoot 指令周围添加声明就足够了。
您可以在 Apache 文档中阅读更多内容基于名称的虚拟主机支持. 特别检查主要宿主消失笔记。