Apache 可以实现‘Include /path/to/*/live.conf’吗?

Apache 可以实现‘Include /path/to/*/live.conf’吗?

我们将 VirtualHost 条目存储在站点 SVN 存储库内的 (dev|staging|live).conf 文件中。

例如:

/var/www/vhosts/site1.com/live.conf
/var/www/vhosts/site2.com/live.conf

能够自动包含它们会很方便,例如:包含 /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 步骤。

可能的?

答案1

apache2 不支持在包含中使用通配符。不过,你可以按照以下方式稍微安排一下:

  • 为您的配置创建一些目录(例如 /etc/apache2/myconfigs)
  • 将您的配置动态符号链接到 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 进行分隔符连接(以提供类似 site1.com_live.conf 符号链接名称),但您可能需要根据自己的 fs 路径进行调整。注意:以上适用于狂欢,可能需要适应其他 shell。

答案2

我已经测试过,检查语法时出现以下错误:

httpd:/etc/httpd/conf/httpd.conf 第 211 行语法错误:包含 /etc/httpd/*/pr.conf 中不允许使用通配符模式

根据文档,从 2.0.41 版本开始,它支持遵循 shell 样式的通配符匹配 (fnmatch())。但它似乎仅适用于文件 (或路径中的最后一个组件),而不适用于目录。

用python测试,返回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

答案3

mod_perl允许以下构造:

<Perl>
    foreach $file (glob '/etc/httpd/conf.d/vhosts/*/live.conf') {
        push @Include, $file;
    }
</Perl>

这可以代替Include指令。

答案4

我已经遇到这个问题一段时间了,并写了一篇博客文章,介绍如何通过对 Apache 应用一些补丁来修复它,希望它能有所帮助。这对我有用 :)

http://wes.limethinking.co.uk/2011/09/07/apache-include-directive-wildcards-in-directory-names/

相关内容