我们将VirtualHost条目存储在SVN存储库中的(dev | staging | live).conf文件中。
例如:
/var/www/vhosts/site1.com/live.conf /var/www/vhosts/site2.com/live.conf
能够自动包含它们会很方便,比如:Include /var/www/vhosts/*/live.conf
但是这似乎并不奏效。
我们用一个简单的PHP脚本来解决它:
$vhosts = ''; foreach (glob('/var/www/vhosts/*/vhost/dev.conf') as $filename) { $vhosts .= "\nInclude $filename"; } file_put_contents('/var/www/vhosts/vhosts.conf', $vhosts);
但是,我很想简化并获得Apache(2.2.3)来完成这项工作,而不需要PHP步骤。
可能?
包含apache2不支持通配符。 但是,您可以按照以下方式进行一些安排:
rm -f /etc/apache2/myconfigs/* for i in $(find /var/www/vhosts/*/live.conf); do \ tempfn=$(echo $i|cut -d/ -f5-6|sed s,/,_,); \ ln -s $i /etc/apache2/myconfigs/$tempfn.conf \ done
注意:关于cut,我使用了-f5-6作为分隔符join(提供类似site1.com_live.conf的符号链接名称),但是您可能需要根据自己的fspath进行调整。 注意注意:上面是bash ,可能需要适应其他shell。
我已经testing过,检查语法时通过下面的错误:
httpd:/etc/httpd/conf/httpd.conf第211行的语法错误:Include /etc/httpd/*/pr.conf中不允许使用通配符模式
根据文档,从2.0.41版开始,它支持通配符匹配,遵循shell风格(fnmatch())。 但它似乎只适用于文件(或path中的最后一个组件),而不是目录。
用python进行testing,它返回true:
In [1]: import fnmatch In [2]: fnmatch.fn fnmatch.fnmatch fnmatch.fnmatchcase In [2]: fnmatch.fnmatch('/etc/httpd/site1.com/live.conf','/etc/httpd/*/live.conf') Out[2]: True
mod_perl允许以下结构:
<Perl> foreach $file (glob '/etc/httpd/conf.d/vhosts/*/live.conf') { push @Include, $file; } </Perl>
这可以用来代替Include指令。
我已经有一段时间了这个问题,并写了一篇博客文章,如何解决它通过应用一些补丁到Apache,我希望它可以帮助。 我为我工作:)
http://wes.limethinking.co.uk/2011/09/07/apache-include-directive-wildcards-in-directory-names/