【问题标题】:How do I include a file in Apache config without generating an error when it doesn't exist?如何在 Apache 配置中包含文件而不在不存在时生成错误?
【发布时间】:2012-03-13 18:42:15
【问题描述】:

这是一个共享配置文件,如果它存在,它应该包含另一个文件,但在其他情况下仍然可以工作。如果我这样做了

Include foo.conf

而且 foo.conf 不存在,apache 会报错:

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

【问题讨论】:

    标签: apache


    【解决方案1】:

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

    Include foo.con[f]
    

    【讨论】:

    • 好把戏。你也可以使用*。我建议将您的 conf 文件放在一个 unike 文件夹中,并像这样包含Include myfolder/*.conf
    • 确实很聪明!我更喜欢 [f] 而不是 * 因为它的风险较小
    • @fedmich。好主意,因为使用 * 可能会导致多个包含被包含在意外的顺序中,这可能会在顺序很重要时导致意外的行为。
    • 我无法使用这个技巧......我得到的只是“没有这样的文件或目录”错误,因为 apache 似乎将括号文字视为文件名的一部分......不确定这里有什么问题。
    • 这不再有效.. 收到此错误No matches for the wildcard 'extra.con[f]' in '/home/www/site', failing。但是下面的IncludeOptional 答案绝对有效!
    【解决方案2】:

    根据http://httpd.apache.org/docs/2.4/mod/core.html#include,您可以使用“IncludeOptional”:

    或者,如果丢失文件或目录,以下命令将被忽略:

    包括可选的 conf/vhosts/*/*.conf

    【讨论】:

    • 注意:这只适用于 Apache 2.3.6 和更新版本(有效 2.4+)
    • IncludeOptional 的关键在于,如果你给它一个没有全局操作符的文字路径,如果它找不到该路径肯定会出错(文档没有说清楚)。否则,带有 Include 的不匹配的球状路径将出错,而带有 IncludeOptional 的球状路径将被静默忽略。
    • 它似乎并没有像我预期的那样完全工作。我开始尝试这个:IncludeOptional /opt/data/sites/*/conf/apache.conf 如果 /opt/data/sites 中的任何目录没有目录“conf”,则会失败。因此,我尝试为所有站点创建“conf”目录。但仍然没有运气。正如 Russel Davis 之前提到的,文件部分需要是通配符。所以现在我有:IncludeOptional /opt/data/sites/*/conf/vhost-*.conf
    • IncludeOptional 将在 2.4.30 之前的版本缺少路径时失败。解决此问题的最简单方法是其他答案中的 glob 技巧,但将每个路径段的第一个字符用“[]”括起来,这样可以防止它失败。
    【解决方案3】:
    IncludeOptional foo.conf
    

    Apache httpd 版本 2.3.6 及更高版本

    https://httpd.apache.org/docs/2.4/mod/core.html#includeoptional

    【讨论】:

      【解决方案4】:

      我尝试了与 Wouter Van Vliet 相同的方法,但仍然出现错误。然后我找到了this link。我将此 sn-p 添加到我的 /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>
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-11-03
        • 2013-05-29
        • 1970-01-01
        • 1970-01-01
        • 2013-07-07
        • 2010-10-07
        相关资源
        最近更新 更多