我从零开始设置我的第一个虚拟服务器(提供程序名称省略,但它是一个“滴”)。 我一直在使用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