Apache可通过Include指令动态加载外部UA黑名单文件,需用SetEnvIfNoCase定义环境变量并配合Require not env(2.4+)或Deny from env(2.2–2.3)实现拦截,路径、权限、语法须合规,支持自动更新。

Apache 可以通过 Include 指令将外部黑名单文件(如第三方维护的 UA 黑名单)动态加载进主配置,实现集中管理、便于更新,且避免直接修改核心配置文件。关键在于路径正确、语法合规、权限合理,并确保 Apache 有读取权限。
一、准备第三方黑名单文件
新建一个纯文本文件(例如 /etc/apache2/blacklists/bad-ua.conf),内容为标准 Apache 指令格式,推荐使用 SetEnvIfNoCase + Deny from env= 或 Require not env(Apache 2.4+):
- 示例内容(支持正则、忽略大小写):
SetEnvIfNoCase User-Agent "(AhrefsBot|MJ12bot|EasouSpider|ZmEu|oBot|python-requests/|go-http-client|masscan|sqlmap)" BAD_UA SetEnvIfNoCase User-Agent "(FeedDemon|Indy Library|HttpClient|heritrix)" BAD_UA
- 注意:不要包含
RewriteEngine或<Directory>等嵌套块;只放环境变量设置和授权相关指令。 - 建议用
^或边界符(如python-requests/而非python)减少误匹配。
二、在主配置中用 Include 加载
在站点配置(如 /etc/apache2/sites-enabled/000-default.conf)或全局模块配置(如 /etc/apache2/mods-enabled/security2.conf)中,插入 Include 指令:
Apache Superset 是一个广泛采用的开源 BI 平台,用于 SQL 探索、图表构建和仪表板交付。当代理需要查询仓库数据、组装仪表板或使用成熟的分析界面解释指标而不是临时笔记本代码时,此技能非常有用。
- Apache 2.2–2.3(旧版)写法:
<Directory "/var/www/html">
AllowOverride All
Order Allow,Deny
Allow from all
Deny from env=BAD_UA
</Directory>
<p>Include /etc/apache2/blacklists/bad-ua.conf- Apache 2.4+(推荐)必须搭配
Require语法:
<Directory "/var/www/html">
Require all granted
Require not env BAD_UA
</Directory>
<p>Include /etc/apache2/blacklists/bad-ua.conf-
Include行可放在<Directory>外部,只要在生效作用域内即可;顺序不影响环境变量定义(SetEnvIfNoCase是全局生效的)。 - 路径支持通配符,如
Include /etc/apache2/blacklists/*.conf,方便按类型拆分规则。
三、权限与验证要点
确保 Apache 进程能读取该文件,否则启动失败或静默失效:
- 文件属主建议设为
root:www-data(Debian/Ubuntu)或root:apache(CentOS/RHEL) - 权限设为
644(rw-r--r--),禁止 world-writable - 执行
sudo apachectl configtest验证语法;若报错 “Could not open include” 或 “Permission denied”,检查路径拼写与 SELinux/AppArmor 策略 - 重启服务后,用
curl -H "User-Agent: AhrefsBot/7.0" -I https://yoursite.com/测试是否返回403 Forbidden
四、配合自动更新更实用
很多开源项目(如 apache-ultimate-bad-bot-blocker)提供定期更新的黑名单脚本。可结合 cron 自动拉取:
- 例如每天凌晨更新:
0 3 * * * wget -qO /etc/apache2/blacklists/bad-ua.conf https://raw.githubusercontent.com/xxx/bot-list/master/apache-bad-ua.conf && systemctl reload apache2 - 注意:远程文件必须是纯 Apache 指令格式,不含 HTML/Markdown 或注释行(Apache 不解析
#行) - 建议先本地测试再上线,避免因第三方内容变更导致服务异常

















