我正在从头开始设置我的第一个虚拟服务器(省略了提供商名称,但它是一个“droplet”)。我使用 WHM 已经有一段时间了,我觉得我对它相当熟悉。
具体来说,它是一台 Debian 8 机器,运行 Apache 2.4(它apache.conf
不使用httpd.conf
)
无论如何,我很难弄清楚将我认为的在任何情况下都可用的全局指令(它们应该适用于每个站点)放在哪里。
简单的例子是设置默认字符集或mod_deflate
启用 gzip。
更具体地说,我已经编写了重写规则来处理不需要的引荐来源(垃圾邮件引荐来源,但我不需要建议,因为我非常熟悉这个问题)。
这基本上就是我所拥有的:
<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 是正确的(我想重定向所有协议、所有子域和所有包含这些字符串的 TLD)。
据我了解,如果将这些规则添加到每个 vhost 指令块中,它们就会起作用,但这似乎非常多余。
我可以在全球范围内应用这些规则,但将它们添加到我的顶部apache.conf
不起作用
我需要把它们包在一个<Directory>
块里吗?
我可以把它们放进去<Directory />
吗?
我所有的网站都在/var/www/html
,我需要在其中应用这些规则吗<Directory /var/www/html>
?
我遗漏了什么(不是因为代码不完整,而是因为指令的排序和知道把它们放在哪里)?
我想使我的.conf
文件尽可能简洁并避免使用.htaccess
(而不是AllowOverrides
出于性能原因),所以我试图弄清楚如何让它工作apache.conf
(将它们放在通过包含调用的文件中是可以接受的,因为已经有几个在使用中)。
答案1
至于重写规则,这些规则在主服务器配置中是允许的,但它们不会影响虚拟主机。手册中有些隐蔽其中有些随意地提到:
请注意,重写配置未继承通过虚拟主机。这意味着你需要有一个
RewriteEngine on
指令对于每个虚拟主机您希望在其中使用重写规则。
因此,作为每个 VirtualHost 的一部分,在包含文件中设置一组通用的规则似乎是前进的方向。
但一般来说:手册列出了每项指令 在允许的情况下,始终是以下一项或多项:
服务器配置
这意味着该指令可以在服务器配置文件(例如 httpd.conf)中使用,但不能在任何容器中使用<VirtualHost>
。.htaccess<Directory>
文件中根本不允许使用该指令。虚拟主机
此上下文意味着该指令可能出现在<VirtualHost>
服务器配置文件的容器内。目录
在此上下文中标记为有效的指令可以在服务器配置文件中的容器内部使用<Directory>, <Location>, <Files>, <If>,
,<Proxy>
但须遵守配置部分中概述的限制。.htaccess
如果指令在此上下文中有效,则意味着它可以出现在每个目录的 .htaccess 文件中。它可能不会被处理,但取决于当前活动的覆盖。
主服务器配置中的指令适用于整个服务器,
内部指令<VirtualHost>
仅适用于该虚拟主机
,并且有一整章介绍所有部分如何结合在一起:
https://httpd.apache.org/docs/2.4/en/sections.html