Apache 虚拟主机未按预期工作

Posted

技术标签:

【中文标题】Apache 虚拟主机未按预期工作【英文标题】:Apache Virtual Hosts Not Working As Expected 【发布时间】:2015-10-08 20:07:03 【问题描述】:

我的 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 将其绕过到第二个条目。第一个条目应该是捕获所有条目。我试图交换第二个和第三个条目以查看它的行为,但它总是将浏览器定向到第二个条目,而不是假设处理诸如 "localhost/test/me 之类的地址的全部(第一个条目) .php"

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

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

【问题讨论】:

只需设置与您相同的配置,它就会按预期工作。 (Windows 10 机器上带有 Apache 2.4.9 的 WAMP 2.5)。你用的是什么版本? @Nasreddine 我的 WAMP 是 2.4,而 Apache 是 2.4.4。 您是否将其关闭并重新打开?重新启动 apache 以确保没有应用较旧的配置。正如 Nasreddine 所说,这个配置是正确的,也为我工作了一百次。 【参考方案1】:

看来问题出在您使用VirtualHost 指令的方式上。

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

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

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

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

所以当你请求localhost/somedir时,服务器会尝试从非通配符的VHosts声明中查找,但没有找到任何对应的主机名(ServerName),所以它选择“默认”第一个VHost使用 IP:Port,而不是第一个使用 *:Port。

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

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

【讨论】:

非常感谢“Zimmi”。现在问题已解决,一切正常。对 Virtualhost 指令进行更改后,它可以完美运行。非常感谢,您让我免于数小时的搜索和搜索。 谢谢,您回答中的前几行帮助解决了我过去 3 小时一直在努力解决的问题

以上是关于Apache 虚拟主机未按预期工作的主要内容,如果未能解决你的问题,请参考以下文章

C++ 虚拟方法未按预期调用

httpd.conf 文件的 <VIRTUAL_HOST> 中的“如果”标记检查 apache 2.4 的 HTTP_UESR_AGENT 未按预期工作

Hue 上的 Apache Pig 0.12.0 未按预期预处理语句

Angular ngOnit () 未按预期工作

$() 函数未按预期工作

navigationController?.navigationBar.isUserInteractionEnabled 未按预期工作