Apache Multiple VirtualDocumentRoot

时间:2009-02-15 08:22:37

标签: apache apache2

在Linux系统上使用Apache2是否可以使用mod_vhost_alias创建多个VirtualDocumentRoot?

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

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

然后在httpd.conf的vhosts部分中我有:

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规则之一的任何文档根。

5 个答案:

答案 0 :(得分:13)

Apache通常会选择第一个ServerNameServerAlias匹配Host 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使用/var/www/domain.comhttp://www.domain.com使用/var/www/www.domain.com,这两个都由第一个vhost提供,/var/www/sub.domain.com用于http://sub.domain.com } {},/var/www/blah.domain.com http://blah.domain.com,等等。

答案 1 :(得分:4)

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

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

答案 2 :(得分:2)

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

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

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

希望能帮助别人!

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

答案 3 :(得分:0)

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

更新(2010-07-24):

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

答案 4 :(得分:0)

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

请参阅mod_vhost_alias

上的apache文档

如果您的root开发域包含dev.example.com这样的3个部分,则可以使用%-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的目录,并使用网址sub.domain.dev.example.com访问该目录。

php_admin_value auto_prepend_file /var/www/setdocroot.php修复了OSX 10.9 +

等系统上的docroot

以下是setdocroot.php的内容:

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