Apache虚拟主机未按预期工作

9

我的Apache "httpd-vhosts.conf" 文件如下:

<VirtualHost *:80>
    DocumentRoot "c:/wamp/www/"
    ServerName localhost
    ServerAlias *.localhost
</VirtualHost>

<VirtualHost laravel.dev:80>
    DocumentRoot "c:/wamp/www/laravel/public"
    ServerName laravel.dev
    ServerAlias *.laravel.dev
</VirtualHost>

<VirtualHost learninglaravel.dev:80>
    DocumentRoot "c:/wamp/www/learningLaravel/public"
    ServerName learningLaravel.dev
    ServerAlias *.learningLaravel.dev
</VirtualHost>

我的 "...system32/drivers/etc/hosts" 文件也是这样的:

127.0.0.1       localhost
127.0.0.1       localhost

// I added the following entries. The first two entries above was already there
127.0.0.1       laravel.dev
127.0.0.1       learninglaravel.dev

当我在浏览器中输入“learningLaravel.dev”和“laravel.dev”时,它们都能正常工作。但是我在我的“www”文件夹中还有其他用于学习PHP的文件夹,我想能够直接从浏览器访问这些文件夹中的文件,例如“localhost/test/me.php”。但每当我输入此类地址时,浏览器都会跳转到vhosts-conf文件的第二个条目 [显示Laravel错误,表示找不到该文件]。似乎第一个条目没有起作用,Apache绕过它而进入了第二个条目。第一个条目应该是捕获所有条目。我尝试交换第二个和第三个条目以查看其行为,但它总是将浏览器重定向到第二个条目,而不是处理“localhost/test/me.php”等地址的捕获所有(第一个)条目。
每当我只输入“localhost”时,它都会直接转到第二个条目,而不是打印“www”文件夹的内容。
如何解决这个问题?谢谢。

刚刚设置了与你相同的配置,一切都按预期工作。(WAMP 2.5,Apache 2.4.9,Windows 10系统)。你使用的是哪个版本? - Nasreddine
@Nasreddine 我的WAMP是2.4版本,其中Apache版本为2.4.4。 - Eddy Freeman
你是否尝试过重启?重新启动Apache以确保没有旧配置应用。正如Nasreddine所说,这个配置是正确的,我也用了一百次。 - Pᴇʜ
1个回答

14

看起来问题出在你使用 VirtualHost 指令的方式上。

不建议对虚拟主机的 IP 地址使用完全限定域名。这会造成混淆。基于名称的虚拟主机是通过 ServerName 指令确定主机,而不是通过 VirtualHost 指令中的 FQDN(<VirtualHost FQDN:80>)来确定的。实际上,这被视为 <VirtualHost 127.0.0.1:80>

虚拟主机文档中记录了你的情况,在倒数第二段和最后一段引用如下:

当收到请求时,服务器首先根据本地 IP 地址和端口组合将其映射到最佳匹配的虚拟主机。非通配符具有更高的优先级。如果根本没有基于 IP 和端口的匹配,则使用“主”服务器配置。

如果多个虚拟主机包含最佳匹配的 IP 地址和端口,则服务器根据请求的主机名从这些虚拟主机中选择最佳匹配。如果找不到匹配的基于名称的虚拟主机,则将使用第一个匹配 IP 地址的虚拟主机。因此,对于给定 IP 地址和端口组合,列表中的第一个虚拟主机是该 IP 和端口组合的默认虚拟主机。

所以当你请求 localhost/somedir 时,服务器会尝试从非通配符 VHosts 声明中找到,但没有找到相应的主机名(ServerName),因此它会选择具有 IP:Port 的“默认”第一个 VHost,而不是具有 *:Port 的第一个 VHost。

要解决问题,请尝试在所有三个 vhost 声明中使用 <VirtualHost *:80>

<VirtualHost *:80>
    DocumentRoot "c:/wamp/www/"
    ServerName localhost
    ServerAlias *.localhost
</VirtualHost>

<VirtualHost *:80>
    DocumentRoot "c:/wamp/www/laravel/public"
    ServerName laravel.dev
    ServerAlias *.laravel.dev
</VirtualHost>

<VirtualHost *:80>
    DocumentRoot "c:/wamp/www/learningLaravel/public"
    ServerName learningLaravel.dev
    ServerAlias *.learningLaravel.dev
</VirtualHost>

重新加载/重启Apache。

(我唯一的疑问是为什么Nasreddine可以使用您的设置创建一个有效的测试用例。)


非常感谢你,"Zimmi"。问题现在已经解决了,一切都运行得很完美。在更改虚拟主机指令后,它完美地工作了。非常感谢你,你让我免于数小时的搜寻和搜索。 - Eddy Freeman
谢谢,你回答中的前几行帮助我解决了一个问题,这个问题让我苦恼了三个小时。 - sandeepkunkunuru

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接