Apache虚拟主机未按预期工作

时间:2015-07-19 17:36:13

标签: php apache laravel virtualhost

我的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”文件夹的内容。

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

1 个答案:

答案 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可以使用你的设置制作一个有效的测试用例。)