我的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 /测试/ me.php“即可。但是无论何时我输入这样的地址,浏览器都会转到 vhosts-conf 文件中的第二个条目[打印一个laravel错误,意味着它无法找到该文件]。似乎 vhosts-conf 文件中的第一个条目无效,Apache将其绕过第二个条目。第一个条目假设是捕获所有条目。我试图交换第二个和第三个条目以查看它的行为,但它始终将浏览器指向第二个条目而不是catch all(第一个条目),它假设处理地址,如“localhost / test / me .PHP“
任何时候我只在浏览器中输入“localhost”,它会直接进入第二个条目,而不是说打印“www”文件夹的内容。
我该如何解决这个问题?感谢。
答案 0 :(得分:4)
问题似乎来自您使用VirtualHost
指令的方式。
建议不要使用完全限定的域名作为虚拟主机的IP地址。这是误导性的。基于名称的虚拟主机通过ServerName
指令确定主机,而不是通过VirtualHost
指令(<VirtualHost FQDN:80>
)中的FQDN。实际上,这被视为<VirtualHost 127.0.0.1:80>
您的案例会记录在VirtualHost doc,最后2段(就在#34;安全&#34;之前),引用:
收到请求后,服务器首先将其映射到最佳状态 基于本地IP地址和端口进行匹配 仅限组合。 非通配符具有更高的优先级。如果不匹配 基于IP和端口发生,&#34;主要&#34;服务器配置是 使用
如果多个虚拟主机包含最匹配的IP地址和 端口,服务器从这些虚拟主机中选择最佳匹配 在请求的主机名上。 如果没有匹配的基于名称的虚拟主机 找到,然后是第一个列出的与IP地址匹配的虚拟主机 将被使用。因此,第一个列出的虚拟主机为 给定的IP地址和端口组合是默认的虚拟主机 IP和端口组合。
因此,当您要求localhost/somedir
时,服务器将尝试从非通配符VHosts声明中查找,但是找不到具有相应主机名(ServerName)的任何声明,因此它选择&#34;默认&#34;第一个带IP的VHost:端口,而不是带有*:Port的第一个。
要解决您的问题,请尝试在所有三个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可以使用你的设置制作一个有效的测试用例。)