如果我设置了一个配置选项,httpd.conf
其中不是在我们的任何虚拟主机中再次使用,它是否对每个虚拟主机都有效,或者每个虚拟主机是否都需要设置选项?
具体来说,我想设置RewriteLog
和RewriteLogLevel
选项。遗憾的是,我们的虚拟主机配置远远超出了合理范围,因此在每个文件中设置此选项并进行验证在部署时会很麻烦(不要让我开始配置管理)。那么,如果我设置它httpd.conf
并确保它不在任何虚拟主机配置中,它会适用于每个虚拟主机吗?
答案1
根据 Apache 文档,配置部分按以下顺序合并:
<Directory>
(正则表达式除外)和 .htaccess 同时完成(如果允许,则使用 .htaccess 覆盖<Directory>
)<DirectoryMatch>
(和<Directory "~">
)<Files>
并<FilesMatch>
同时完成<Location>
并<LocationMatch>
同时完成<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>
将其全局放置会将您的日志记录选项应用于每个子范围。