Apache 配置优先级

Apache 配置优先级

如果我设置了一个配置选项,httpd.conf其中不是在我们的任何虚拟主机中再次使用,它是否对每个虚拟主机都有效,或者每个虚拟主机是否都需要设置选项?

具体来说,我想设置RewriteLogRewriteLogLevel选项。遗憾的是,我们的虚拟主机配置远远超出了合理范围,因此在每个文件中设置此选项并进行验证在部署时会很麻烦(不要让我开始配置管理)。那么,如果我设置它httpd.conf并确保它不在任何虚拟主机配置中,它会适用于每个虚拟主机吗?

答案1

根据 Apache 文档,配置部分按以下顺序合并:

  1. <Directory>(正则表达式除外)和 .htaccess 同时完成(如果允许,则使用 .htaccess 覆盖<Directory>
  2. <DirectoryMatch>(和<Directory "~">
  3. <Files><FilesMatch>同时完成
  4. <Location><LocationMatch>同时完成
  5. <If>

一些重要的评论:

  • 除 之外<Directory>,每个组中的部分都按照它们在配置文件中出现的顺序进行处理。例如,对 /foo 的请求将匹配<Location "/foo/bar"><Location "/foo">(在本例中为第 4 组):这两个部分都将被评估,但按照它们在配置文件中出现的顺序进行评估。
  • <Directory>(上面的第 1 组)按从最短目录组件到最长目录组件的顺序进行处理。例如,<Directory "/var/web/dir">将在 之前进行处理<Directory "/var/web/dir/subdir">
  • 如果多个<Directory>部分适用于同一目录,则它们按照配置文件的顺序进行处理。
  • 通过 Include 指令包含的配置将被视为位于 Include 指令位置的包含文件内。
  • 节内的节<VirtualHost>在虚拟主机定义之外的相应节之后应用。这允许虚拟主机覆盖主服务器配置。
  • <Directory>当请求由 mod_proxy 提供服务时,容器将按处理顺序取代容器。

例如,以下将按 A > B > C > D > E 的顺序应用:

<Location "/">
    E
</Location>

<Files "f.html">
    D
</Files>

<VirtualHost *>
    <Directory "/a/b">
        B
    </Directory>
</VirtualHost>

<DirectoryMatch "^.*b$">
    C
</DirectoryMatch>

<Directory "/a/b">
    A
</Directory>

更多信息可以在文档中找到:https://httpd.apache.org/docs/2.4/sections.html

编辑:

<Directory>诸如、<DirectoryMatch><Files><FilesMatch>、和 之<Location>类的指令只是限制了它们所包含的指令的范围,因此将指令应用于文件的全局区域将会全局应用它。<LocationMatch><VirtualHost><IfModule>

如果您尝试覆盖mod_rewrite,您可以考虑利用设置RewriteOptions为 的指令InheritDown。这将导致所有子配置从父范围继承设置,相当于放入RewriteOptions Inherit每个子范围。

<IfModule mod_rewrite.c>
    RewriteOptions InheritDown
    RewriteLog [some setting here]
    RewriteLogLevel [somesettinghere]
</IfModule>

将其全局放置会将您的日志记录选项应用于每个子范围。

相关内容