Apache指令sorting:全局,前VHost或目录块

我从零开始设置我的第一个虚拟服务器(提供程序名称省略,但它是一个“滴”)。 我一直在使用WHM一段时间,我觉得我很熟悉它。

具体来说,这是一台运行Apache 2.4的Debian 8机器(它使用apache.conf而不是httpd.conf

无论如何,我很难弄清楚在哪里把我认为是全球指令(它们应该适用于每个站点)在每种情况下都可用。

简单的例子是设置默认字符集或启用mod_deflate来激活gzip。

更具体地说,我已经写了重写规则来处理不需要的引用(spam referrer,但我不需要关于这个问题我非常熟悉的build议)。

这基本上是我所拥有的:

 <IfModule mod_rewrite.c> RewriteEngine on Options FollowSymlinks RewriteCond %{HTTP_REFERER} (badreferer1\..*) [NC,OR] RewriteCond %{HTTP_REFERER} (crappy-referer2\..*) [NC,OR] RewriteCond %{HTTP_REFERER} (webiste-i-hate3\..*) [NC] RewriteRule ^(.*)$ http://%1 [R=301,L] </IfModule> 

我很确定我的RegEx是正确的(我想redirect所有的协议,所有的子域和所有包含这些string的TLD)。

我的理解是,如果将这些规则添加到每个vhost指令块中,这些规则就可以工作,但似乎非常多余。

我会很好地应用这些规则在全球范围内,但将其添加到我的apache.conf顶部是行不通的

我是否需要将它们包装在<Directory>块中?

我可以把它们放在<Directory />吗?

我的所有网站都在/var/www/html ,是否需要在<Directory /var/www/html>应用这些规则?

我错过了什么(不是在代码方面,因为这个片段是不完整的,但在订购指令和知道把它们放在哪里)?

我想保持我的.conf文件尽可能简洁,避免使用.htaccess (而不是AllowOverrides出于性能的原因),所以我想弄清楚如何让这个工作在apache.conf (把他们在一个通过include调用的文件是可以接受的,因为已经有几个正在使用)。

关于重写规则,在主服务器configuration中允许使用这些规则,但不影响VirtualHosts。 有些隐藏在手册中,有些随便提到:

请注意,重写configuration不会被虚拟主机inheritance 。 这意味着您需要为每个您希望使用重写规则的虚拟主机 RewriteEngine on指令。

因此,作为每个虚拟主机的一部分,包含文件中的一组通用规则似乎是前进的方向。

一般来说:手册列出了每个允许的指令 ,它总是一个或多个:

  • 服务器configuration
    这意味着该指令可以在服务器configuration文件(例如httpd.conf)中使用,但不能在任何<VirtualHost><Directory>容器中使用。 它不允许在.htaccess文件中。

  • 虚拟主机
    这个上下文意味着该指令可能出现在服务器configuration文件的<VirtualHost>容器中。

  • 目录
    在上下文中标记为有效的指令可以在服务器configuration文件中的<Directory>, <Location>, <Files>, <If>,<Proxy>容器内使用,但要遵守configuration部分中列出的限制。

  • 的.htaccess
    如果一个指令在这种情况下是有效的,这意味着它可以出现在每个目录.htaccess文件中。 它可能不会被处理,尽pipe取决于当前活动的覆盖。

主服务器configuration中的指令适用于整个服务器,
<VirtualHost>指令仅适用于该虚拟主机
关于所有部分如何结合在一起的整章: https : //httpd.apache.org/docs/2.4/en/sections.html