Apache:适用于服务器范围的通用 SetEnvIF 拒绝规则/适用于所有域?

Apache:适用于服务器范围的通用 SetEnvIF 拒绝规则/适用于所有域?

在我的 Apache 中,我有一个很长的要阻止的 IP 列表(出于某些原因)。然后我目前将这些规则放入.htaccess我拥有的每个 docroot(域)的文件中。

规则如下:

SetEnvIF X-Forwarded-For "1.2.3.*" DenyIP
SetEnvIF X-Forwarded-For "100.200.*.*" DenyIP
..
..
..
..
..
..
Order Deny,Allow
Deny from env=DenyIP

这些相同的.htaccess文件现在位于如下位置:

/var/www/html/www.site-a.com/.htaccess
/var/www/html/www.site-b.com/.htaccess
/var/www/html/www.site-c.com/.htaccess
/var/www/html/www.site-d.com/.htaccess
/var/www/html/www.site-e.com/.htaccess
/var/www/html/www.site-f.com/.htaccess
/var/www/html/www.site-g.com/.htaccess
..

就是这样的。但是每当我需要更新 IP 时,我都必须编辑所有这些文件。

问题:

我如何应用这些通用规则服务器范围(Apache 范围),以便它们可以应用于我的 Apache 中的每个网站 docroot(域)?

答案1

看一眼Apache 2.2 配置部分访问控制

  • 指令AllowDeny属于上下文:Directory.htaccess
  • .htaccess的等效项<Directory>,但有限制,例如
    • 您不能Include在里面使用.htaccess
    • AllowOverride控制您可以使用.htaccess配置进行哪些更改。
  • 配置部分有合并顺序,缩写为:

    1. <Directory>(正则表达式除外)并.htaccess同时完成(.htaccess如果允许,则覆盖<Directory>
    2. <DirectoryMatch>(和<Directory ~>
    3. <Files><FilesMatch>同时完成
    4. <Location><LocationMatch>同时完成
  • 您可以<Directory><VirtualHost>部分之外拥有全局部分:

    节内的节<VirtualHost>在虚拟主机定义之外的相应节之后应用。这允许虚拟主机覆盖主服务器配置。

简而言之,在你的主函数中httpd.conf,有这个并且不要在里面覆盖它<VirtualHost>

<Directory /var/www/html>
    SetEnvIF X-Forwarded-For "1.2.3.*" DenyIP
    SetEnvIF X-Forwarded-For "100.200.*.*" DenyIP
    ..
    Order Deny,Allow
    Deny from env=DenyIP
</Directory>

如果您不想使用长SetEnvIF列表httpd.conf,请使用 [ Include][6]

<Directory /var/www/html>
    Include /path/to/SetEnvIF-list.conf
    Order Deny,Allow
    Deny from env=DenyIP
</Directory>

请注意这里链接的所有文档都提到的内容:

本文档涉及 Apache httpd 的 2.2 版本,该版本已不再维护。活动版本已记录在案这里。如果您尚未升级,请按照此链接了解更多信息。

访问控制Apache 2.4有点不同,但你可以在 mod_authz_core 中使用环境变量Requireenv. 设置变量时否定代替允许,您需要在实体名称not之前使用。env

SetEnvIF X-Forwarded-For "1.2.3.*" DenyIP
<Directory "/var/www/html">
    Require not env DenyIP
</Directory>

相关内容