Apache多VirtualDocumentRoot

在Linux系统上使用Apache2有一种方法可以使用mod_vhost_alias来创build多个VirtualDocumentRoot?

这是我目前正在使用的命名约定,并希望继续使用:

host directory 127.0.0.1 domain domain.com 127.0.0.1 sub.domain domain.com_sub 

然后在我的虚拟主机部分的httpd.conf中有:

 NameVirtualHost 127.0.0.1 <VirtualHost 127.0.0.1> VirtualDocumentRoot /var/www/%0.0.com </VirtualHost> <VirtualHost 127.0.0.1> VirtualDocumentRoot /var/www/%2.0.com_%1 </VirtualHost> 

这个问题是当我访问sub.domain Apache错误日志显示它正在寻找/var/www/sub.domain.com而不是/var/www/domain.com_test,这导致我相信它只读取第一个规则,然后失败,但我想要做的是使用任何满足两个VirtualDocumentRoot规则的任何文档根。

Apache通常会选择serverNameserverAliasHost HTTP头中提供的主机名相匹配的第一个虚拟主机。 在你的情况下,因为你没有serverName指令,Apache应该使用IP地址上的反向DNS查找来伪造服务器名称,并假设反向DNS导致domain.com,这不匹配,Apache然后默认为第一个虚拟主机。 听起来很复杂,我知道…底线是,你应该使用serverNameserverAlias来明确配置。 尝试更像这样的事情:

 NameVirtualHost 127.0.0.1 <VirtualHost 127.0.0.1> serverName domain.com serverAlias www.domain.com VirtualDocumentRoot /var/www/%0 </VirtualHost> <VirtualHost 127.0.0.1> serverName sub.domain.com serverAlias *.domain.com VirtualDocumentRoot /var/www/%2.%3_%1 </VirtualHost> 

这应该使用http://domain.com&#x7684; /var/www/www.domain.comhttp://www.domain.com&#x7684; /var/www/www.domain.com ,两者都由第一个虚拟主机, http : /var/www/blah.domain.com/var/www/sub.domain.com/var/www/blah.domain.com ,依此类推。

当你想放置一个'。'时,你必须限定反向引用。 在文件路径中。 所以你需要像这样:

 VirtualDocumentRoot /var/www/%2.0.%3_%1 

关于OP和设置“/ var / www / html”的问题:

我遇到的问题是使用%1而不是%2。 这是我的工作示例:

 serverAlias www.*.org.au UseCanonicalName Off VirtualDocumentRoot /path/to/sites/%2/pub 

希望帮助别人!

我阅读了mod_vhost_alias文档中的 “目录名称插值” 文档 。

我注意到这个配置是$ _SERVER ['DOCUMENT_ROOT']指向/ var / www / html而不是虚拟主机的doc根目录。 奇怪的。

更新(2010-07-24):

我刚刚写了一篇博客文章如何设置您的http证明服务器http://www.devcha.com/2010/07/how-to-setup-your-http-proof-server.html

我终于找到了一个允许灵活的子域创建的配置。

请参阅mod_vhost_alias上的 apache文档

如果您的根开发域包含3个部分,如dev.example.com,则可以使用%-4+作为根域之前所有内容的占位符。 如果它有4个部分,使用%-5+

 <VirtualHost *:80> VirtualDocumentRoot "/var/www/%-4+/webroot" serverName www.dev.example.com serverAlias *.dev.example.com php_admin_value auto_prepend_file /var/www/setdocroot.php </VirtualHost> 

这样,您可以创建一个名为/var/www/sub.domain/webroot的目录,并使用url sub.domain.dev.example.com访问它。

php_admin_value auto_prepend_file /var/www/setdocroot.phpphp_admin_value auto_prepend_file /var/www/setdocroot.php修复了一些系统上的文档根目录,比如OSX 10.9+

这里是setdocroot.php的内容:

 <?php $_SERVER['DOCUMENT_ROOT'] = str_replace($_SERVER['SCRIPT_NAME'], '', $_SERVER['SCRIPT_FILENAME']); ?>