覆盖单个 VirtualHost 的批量虚拟主机

覆盖单个 VirtualHost 的批量虚拟主机

我不确定这个问题的表述是否正确。

基本上,我通过以下方式设置http://httpd.apache.org/docs/2.2/vhosts/mass.html这样我只需要在 ~/Sites 文件夹中创建一个文件夹(例如 example.test),然后就可以转到http://example.test(假设我的主机文件匹配)。

我正在开展几个项目,这些项目在公共目录的上一级安装了框架,所以我想知道是否可以用单个虚拟主机覆盖大规模虚拟主机。

我尝试了以下操作:

# I want this...
NameVirtualHost *:80

<VirtualHost *:80>
    DocumentRoot /Users/cameron/Sites/laravel.test/public
    ServerName laravel.test
</VirtualHost>

# ...to override this only for laravel.test
UseCanonicalName Off
VirtualDocumentRoot /Users/cameron/Sites/%0

Laravel PHP 框架将框架安装在公共级别之上,就像我说的,所以当我去http://laravel.test,我希望它去/Users/cameron/Sites/laravel.test/public而不是/Users/cameron/Sites/laravel.test/如果这有意义的话......

但上面的代码不起作用。它基本上忽略了最后两行之前的所有内容。

所以我的问题是... 有没有办法实现我想要的?不一定是我尝试的方法,但我有大量的本地网站,其中 99% 在大规模虚拟主机方法下运行良好,我只是偶尔想覆盖该行为。

答案1

文档VirtualDocumentRoot说用来none将其关闭,所以我假设您需要做的就是将其添加到您的<VirtualHost>部分:

<VirtualHost *:80>
    DocumentRoot /Users/cameron/Sites/laravel.test/public
    VirtualDocumentRoot none
    ServerName laravel.test
</VirtualHost>

但这还不够:使用 时,如果传入请求与任何块的/NameVirtualHost都不匹配,则使用第一个块,无论其名称是什么。在这种情况下,它会导致所有其他主机名也使用此 VirtualHost 指令。ServerNameServerAlias<VirtualHost><VirtualHost>

解决此问题的可能方法是将 VirtualDocumentRoot 指令移到<VirtualHost>配置中位于其他任何站点之前的块中。ServerName此块的 应该无关紧要,例如:

<VirtualHost *:80>
     ServerName bogusname
     UseCanonicalName Off
     VirtualDocumentRoot /Users/cameron/Sites/%0
</VirtualHost>

虚假名称应确保此 VirtualHost 仅在没有其他 VirtualHosts 与请求匹配的“默认”情况下使用。

相关内容