Apache 虚拟主机未按预期工作

Edd*_*man 5 php apache virtualhost laravel

我的 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>
Run Code Online (Sandbox Code Playgroud)

而我的“...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
Run Code Online (Sandbox Code Playgroud)

当我在浏览器中输入“learningLaravel.dev”“laravel.dev”时,它们按预期工作正常。但是我的“www”文件夹中有其他文件夹,我用它们来学习 PHP,我希望能够直接从浏览器访问这些文件夹中的文件,比如“localhost/test/me.php”。但是每当我输入这样的地址时,浏览器都会转到vhosts-conf文件中的第二个条目[打印一个 laravel 错误,意味着它找不到该文件]。似乎是第一个条目vhosts-conf文件不起作用,Apache 将其绕过到第二个条目。第一个条目应该是 catch all 条目。我试图交换第二个和第三个条目以查看它的行为方式,但它总是将浏览器定向到第二个条目,而不是假设处理“localhost/test/me.php”等地址的全部捕获(第一个条目)

任何时候我在浏览器中只输入“localhost”,它都会直接进入第二个条目,而不是说打印“www”文件夹的内容。

我该如何解决这个问题?谢谢。

Zim*_*mmi 7

问题似乎来自您使用VirtualHost指令的方式。

不建议对虚拟主机的 IP 地址使用完全限定的域名。它的工作方式具有误导性。基于名称的虚拟主机通过ServerName指令确定主机,而不是通过VirtualHost指令 ( <VirtualHost FQDN:80>) 中的 FQDN 。事实上,这被视为<VirtualHost 127.0.0.1:80>

发生的情况是您的情况记录在VirtualHost doc 中,最后 2 段(就在“安全”之前),引用:

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

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

因此,当您请求时localhost/somedir,服务器将尝试从非通配符 VHosts 声明中查找,但找不到任何具有相应主机名(ServerName)的,因此它选择第一个具有 IP:Port 的 VHost 作为“默认”,并且不是第一个带 *:Port 的。

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

<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>
Run Code Online (Sandbox Code Playgroud)

并重新加载/重新启动Apache。

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