是否可以使用Apache包含/path/to/*/live.conf?

我们将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不支持通配符。 但是,您可以按照以下方式进行一些安排:

  • 为你的configuration创build一些目录(比如/ etc / apache2 / myconfigs)
  • 将您的configurationdynamic链接到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 
  • 在你的apache2.conf中添加一个“Include / etc / apache2 / myconfigs”

注意:关于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/