apache通过include导入动态ua黑名单,核心是将恶意爬虫规则抽离主配置,用setenvifnocase标记badbot/goodbot,配合requireall实现精准拦截,并通过脚本自动更新conf文件后reload生效。

Apache 用 Include 导入自动更新的恶意爬虫 UA 列表,核心是把 UA 黑名单从主配置中剥离出来,单独存为可动态替换的文件,并通过 Include 指令加载。这样既保持主配置稳定,又支持脚本定期更新黑名单(比如每天拉取最新 UA 规则),无需手动改 httpd.conf 或重启服务。
✅ 为什么用 Include 而不是硬编码在主配置里?
- 主配置(如
httpd.conf或虚拟主机块)应尽量保持静态、安全、易审计; - 恶意 UA 特征变化快(新扫描器、新伪装模式),手动维护易滞后;
-
Include支持通配符(如Include conf/agents/*.conf),方便按类型或来源拆分管理; - 配合脚本 + cron,可实现“零停机”更新:生成新文件 → 原子替换 → Apache 自动生效(需重载,但不中断连接)。
? 步骤一:准备独立的 UA 黑名单文件
创建目录并新建规则文件(推荐路径清晰、权限受限):
sudo mkdir -p /etc/apache2/conf-available/bot-block/ sudo touch /etc/apache2/conf-available/bot-block/user-agents.conf
在 user-agents.conf 中写入标准 SetEnvIfNoCase 规则,例如:
# /etc/apache2/conf-available/bot-block/user-agents.conf
SetEnvIfNoCase User-Agent "(ahrefsbot|semrushbot|dotnetcurl|python-requests|go-http-client|ltx71|masscan|nikto|sqlmap|Scrapy|ZmEu|MJ12bot|heritrix)" BADBOT
SetEnvIfNoCase User-Agent "(Baiduspider|Googlebot|YandexBot|Bingbot|Sogou|DuckDuckBot)" GOODBOT
# 允许主流爬虫,拒绝其他标记为 BADBOT 的 UA
<requireall>
Require all granted
Require not env BADBOT
Require env GOODBOT
</requireall>
⚠️ 注意:
-
RequireAll是 Apache 2.4+ 推荐写法,兼容性与逻辑比旧式Order Allow,Deny更清晰; - 不要在此文件中写
DocumentRoot或<directory></directory>块——它只是规则片段,由主配置引入后作用于对应上下文。
? 步骤二:在主配置或虚拟主机中启用 Include
在你的站点配置中(如 /etc/apache2/sites-enabled/000-default.conf),插入:
Apache Superset 是一个广泛采用的开源 BI 平台,用于 SQL 探索、图表构建和仪表板交付。当代理需要查询仓库数据、组装仪表板或使用成熟的分析界面解释指标而不是临时笔记本代码时,此技能非常有用。
# 在 <virtualhost> 或 <directory> 块内添加(推荐放在最外层或 DocumentRoot 对应的 Directory 块)
<directory>
Options Indexes FollowSymLinks
AllowOverride None
Require all granted
# 引入外部 UA 规则
Include conf-available/bot-block/user-agents.conf
</directory></directory></virtualhost>
或者全局启用(放在 httpd.conf 末尾):
# 全局生效(慎用,确保规则不冲突) Include conf-available/bot-block/*.conf
✅ 确保 Include 路径是相对于 ServerRoot(通常是 /etc/apache2 或 /usr/local/apache2),可用绝对路径避免歧义:
Include /etc/apache2/conf-available/bot-block/user-agents.conf
⚙️ 步骤三:配合脚本自动更新黑名单
写一个轻量更新脚本(如 /usr/local/bin/update-bot-list.sh):
#!/bin/bash
# 下载或生成最新 UA 黑名单(示例:从本地维护的 txt 生成 conf)
UA_LIST="/tmp/bad-ua.list"
CONF_OUT="/etc/apache2/conf-available/bot-block/user-agents.conf"
# 示例:从文本列表生成 SetEnvIfNoCase 行(每行一个 UA 模式)
awk 'NF && !/^#/ { printf "\"%s\" ", $0 }' "$UA_LIST" | \
sed 's/ $//' | \
awk '{print "SetEnvIfNoCase User-Agent (" $0 ") BADBOT"}' > "$CONF_OUT.tmp"
# 补充 GOODBOT 和 Require 逻辑
cat >> "$CONF_OUT.tmp"
Require all granted
Require not env BADBOT
Require env GOODBOT
EOF
mv "$CONF_OUT.tmp" "$CONF_OUT"
systemctl reload apache2 # 或 apachectl graceful
再加到 crontab(每天凌晨 3 点更新):
0 3 * * * /usr/local/bin/update-bot-list.sh >/dev/null 2>&1
? 验证是否生效
- 检查语法:
apachectl configtest - 查看日志是否命中:访问时用 curl 模拟恶意 UA
curl -A "python-requests/2.31.0" http://yoursite.com/health # 应返回 403
- 确认
Include被加载:apache2ctl -t -D DUMP_INCLUDES(Apache 2.4.49+)
? 补充建议
- 把 UA 列表源托管在 Git 或内部 API,脚本
curl -s https://internal/api/bad-ua.txt > /tmp/bad-ua.list; - 加入 Referer + URI 组合判断(如空 Referer +
/wp-login.php),这类规则也建议单独抽成referer-path.conf并Include; - 使用
mod_env和mod_authz_core是前提,确保已启用:a2enmod env authz_core
不复杂但容易忽略:Include 文件权限必须是 Apache 可读(如 644),且路径不能有符号链接跳转(除非 FollowSymLinks 显式开启)。










