在Apache配置中包含一个文件时,如果它不';不存在?

在Apache配置中包含一个文件时,如果它不';不存在?,apache,Apache,这适用于共享配置文件,该文件应包含另一个文件(如果存在),但在其他情况下仍然有效。如果我这样做 Include foo.conf 如果foo.conf不存在,apache会抱怨: could not open document config file /etc/httpd/conf/foo.conf 我想出了一个聪明的解决办法,尽管可能有更好的办法。将其中一个字符放在括号中,以便Apache将其视为glob模式,允许它匹配零个文件而不会导致错误。例如: Include foo.con[f]

这适用于共享配置文件,该文件应包含另一个文件(如果存在),但在其他情况下仍然有效。如果我这样做

Include foo.conf
如果foo.conf不存在,apache会抱怨:

could not open document config file /etc/httpd/conf/foo.conf

我想出了一个聪明的解决办法,尽管可能有更好的办法。将其中一个字符放在括号中,以便Apache将其视为glob模式,允许它匹配零个文件而不会导致错误。例如:

Include foo.con[f]
根据需要,您可以使用“IncludeOptional”:

或者,如果缺少文件或目录,将忽略以下命令:

包括可选配置/vhosts/*/*.conf


我尝试了和沃特·范维利特一样的方法,但还是有错误。然后我发现。我把这个片段添加到我的/etc/apache2/apache2.conf中,它就像一个符咒

注意:您需要mod_perl

代码如下:

<perl>
    use File::stat;
    foreach $file (glob '/srv/www/vhosts/*/conf/vhost.conf') {
        my $stat = stat($file);
        if ($stat-&gt;uid != 0 || $stat-&gt;gid != 0) {
            warn "$file is not owned by root:root, skipping!\n";
            next;
        }
        if ($stat-&gt;mode &amp; 0002) {
            warn "$file is world-writable, skipping!\n";
            next;
        }
        push @Include, $file;
    }
</perl>

使用File::stat;
foreach$文件(glob'/srv/www/vhosts/*/conf/vhost.conf'){
my$stat=stat($file);
如果($stat uid!=0 | |$stat gid!=0){
警告“$文件不归root所有:root,正在跳过!\n”;
下一个
}
如果($stat mode&;0002){
警告“$文件是全局可写的,正在跳过!\n”;
下一个
}
推送@Include$file;
}
Apache httpd 2.3.6版及更高版本


好把戏。您也可以使用
*
。我建议将您的conf文件放在unike文件夹中,并像这样包含
include myfolder/*.conf
真聪明!我更喜欢[f]而不是*,因为它少一点risky@fedmich. 好主意,因为使用*可能会导致多个包含被包含在意外的顺序中,这可能会在顺序重要时导致意外的行为。我无法让这个技巧工作…我得到的只是“没有这样的文件或目录”错误,因为apache似乎将方括号文字视为文件名的一部分…不确定这里出了什么问题。注意:这只适用于apache 2.3.6和更新版本(实际上是2.4+)IncludeOptional的关键问题是,如果您给它一个没有glob运算符的文字路径,如果找不到该路径,它肯定会出错(文件没有明确说明)。否则,带有Include的不匹配球状路径将出错,而带有IncludeOptional的路径将被静默忽略。它似乎不像我预期的那样完全工作。我从尝试以下内容开始:
IncludeOptional/opt/data/sites/*/conf/apache.conf
,如果/opt/data/sites中的任何direcotry没有direc,则失败tory'conf'。因此,我尝试为所有站点创建'conf'目录。但仍然没有成功。正如Russel Davis之前提到的,文件部分需要是通配符。因此现在我有:
IncludeOptional/opt/data/sites/*/conf/vhost-*.conf
IncludeOptional将在2.4.30之前版本的丢失路径上失败。最简单的方法是解决这个问题的方法是在另一个答案中使用glob技巧,但在每个路径段的第一个字符周围使用“[]”,这将防止它失败。
IncludeOptional foo.conf