阿帕奇虚拟主机未按预期工作
我的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
指令的方式。
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可以用您的设置制作一个工作测试用例。)
相关文章