阿帕奇虚拟主机未按预期工作

2022-05-18 00:00:00 php laravel apache virtualhost

我的apache"httpd-vhost s.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错误,表示找不到该文件]。vhosts-conf文件中的第一个条目似乎不起作用,而Apache会将其跳过到第二个条目。第一个条目应该是Catch All条目。我尝试交换第二个和第三个条目以查看它的行为,但它总是将浏览器定向到第二个条目,而不是应该处理地址的Catch All(第一个条目),如"Localhost/test/me.php"

只要我在浏览器中只输入"localhost",它就会直接转到第二个条目,而不是打印"www"文件夹的内容。

如何解决此问题?谢谢。


解决方案

问题似乎源于您使用VirtualHost指令的方式。

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

您的案例记录在VirtualHost doc最后两段(就在"安全"之前),引用:

当收到请求时,服务器首先将其映射到最好的 根据本地IP地址和端口进行匹配 仅限组合。非通配符优先。如果没有匹配 根据出现的IP和端口,"主"服务器配置为 已使用。

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

因此,当您请求localhost/somedir时,服务器将尝试从非通配符VHosts声明中查找,但找不到任何具有对应主机名(Servername)的VHost声明,因此它选择第一个具有ip:port而不是第一个具有*: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可以用您的设置制作一个工作测试用例。)

相关文章