Apache多重VirtualDocumentRoot
在Linux系统上使用Apache2有没有办法让多个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
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配置,或者设置一个定制的日志文件。“我们怎么能这样做呢?”史东尼说,我建议你继续问下去,或许吧。