在 Apache 中启用虚拟主机会禁止所有主机 (403)

Enabling virtual hosts in Apache makes every host forbidden (403)

我在 Windows 8,刚刚在 C:/wamp 安装了 Wamp 2.5 (Apache 2.4.9) 以在本地测试我的代码。我的源代码存储库位于 D:/workpace/project1,我使用 GIT 对其进行管理(GIT 是我不想打扰其位置的原因之一)。

安装 Wamp 后,我通过取消注释 httpd.conf 中的以下行来继续启用虚拟主机。

 #Include conf/extra/httpd-vhosts.conf

然后我前往 conf/extra/httpd-vhosts.conf 创建了它的备份并创建了虚拟主机。

<VirtualHost *:80>
    ServerAdmin admin@example.com
    DocumentRoot "D:/workspace/project1/"
    ServerName project1
    ServerAlias p1
    ErrorLog "logs/project1(local)-error.log"
    CustomLog "logs/project1(local)-access.log" common
    <Directory "D:/workspace/project1/">
        Require all granted
    </Directory>
</VirtualHost>

还编辑了主机文件并添加了必要的行。

127.0.0.1       project1
127.0.0.1       p1

问题是我不仅在访问 project1/p1/ 时遇到 403 Forbidden 错误,而且在访问 localhost/.

时也遇到错误

当我通过注释掉 httpd.conf 中的 httpd-vhosts.conf 时,

    Include conf/extra/httpd-vhosts.conf

我可以访问 localhost/,但正如预期的那样,project1/p1/ 也解决了 localhost/

令人惊讶的是,当我在 httpd.conf 中重新启用 httpd-vhosts.conf 并恢复原始(未更改)httpd-vhosts.conf 的备份时,我仍然得到 403 (Forbidden) 即使在 localhost/。但是当我再次禁用 httpd-vhosts.conf 时,localhost/ 恢复正常。

更令人惊讶的是,如果我将 DocumentRoot 更改为 c:/wamp/www 中的虚拟文件夹,情况是一样的。所以这不仅发生在 DocumentRootc:/wamp/www 之外时。

我觉得我有一些额外的东西要启用,因为我不可能搞砸任何东西,因为这是一个全新的安装,除了上面的那些我没有做任何改变。

Apache 无法与虚拟主机相处的原因可能是什么?

有些事情您没有考虑到。

创建虚拟主机时,Apache 会忽略 httpd.conf 中定义的主机,因此您还需要为 localhost 创建虚拟主机。这解释了为什么在激活虚拟主机后无法到达 localhost

Apache 支持 IPV4 和 IPV6,因此当您在 HOSTS 文件中创建域名时,您需要对 IPV4 和 IPV6 堆栈都这样做。所以你需要有一个像这样的主机文件:-

#IPV4 Stack
127.0.0.1  localhost
127.0.0.1  project1

#IPV6 Stack
::1 localhost
::1 project1

浏览器会任意决定是使用 IPV4 堆栈还是 IPV6 堆栈。希望我明白为什么以及出于什么原因它使这个决定更好,但基本上当你输入域名、浏览器或网络堆栈时,选择 IPv4 或 IPv6 作为你第一次接触域然后坚持那个决定,但它两者都可以。

这是 post should help you create Virtual Hosts