Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/apache/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Apache多重VirtualDocumentRoot_Apache_Apache2 - Fatal编程技术网

Apache多重VirtualDocumentRoot

Apache多重VirtualDocumentRoot,apache,apache2,Apache,Apache2,在Linux系统上使用Apache2有没有办法让多个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

在Linux系统上使用Apache2有没有办法让多个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>
NameVirtualHost 127.0.0.1
VirtualDocumentRoot/var/www/%0.0.com
VirtualDocumentRoot/var/www/%2.0.com\u%1

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

Apache通常会选择第一个虚拟主机,其
ServerName
ServerAlias
host
HTTP头中提供的主机名匹配。在您的情况下,由于您没有
ServerName
指令,Apache假定在IP地址上使用反向DNS查找来伪造服务器名称,并假定反向DNS指向domain.com,而domain.com不匹配,Apache则默认为第一个虚拟主机。听起来很复杂,我知道。。。底线是,您应该使用
ServerName
ServerAlias
来明确配置。尝试类似以下内容:

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>
VirtualDocumentRoot /var/www/%2.0.%3_%1
NameVirtualHost 127.0.0.1
ServerName域名.com
ServerAlias www.domain.com
VirtualDocumentRoot/var/www/%0
ServerName sub.domain.com
ServerAlias*.domain.com
VirtualDocumentRoot/var/www/%2.%3\u%1

这应该使用
/var/www/domain.com
for和
/var/www/www.domain.com
for,这两个都由第一个vhost提供服务,而
/var/www/sub.domain.com
for和
/var/www/blah.domain.com
for等等。

我注意到的是$\u服务器['DOCUMENT ROOT']指向/var/www/html,而不是vhost的文档根。 奇怪

更新(2010-07-24):

我刚刚写了一篇关于如何设置http验证服务器的博文

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

我必须解决的问题是使用%1而不是%2。以下是我的工作示例:

ServerAlias www.*.org.au
UseCanonicalName Off
VirtualDocumentRoot /path/to/sites/%2/pub
希望这对别人有帮助


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

如果要在文件路径中添加“.”,则必须限定反向引用。所以你需要这样做:

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>
VirtualDocumentRoot /var/www/%2.0.%3_%1

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

请参阅上的apache文档

如果您的根dev域有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>

我假设你已经解决了这个问题,但为了完整性,我已经在下面发布了,因为这是在谷歌搜索中出现的。你可能想把这个问题标记为已回答?这救了我一天。我在两个具有VirtualDocumentRoot定义的VirtualHost文件之间切换。我知道一定有更好的办法,你也明白了。谢谢这个解决方案解决了我的问题。但是我有一个新问题,对于一些特殊的子域,我需要做一些特殊的配置,比如添加JK配置,或者设置一个定制的日志文件。“我们怎么能这样做呢?”史东尼说,我建议你继续问下去,或许吧。