nginx可通过include指令加载外部恶意ua规则文件实现拦截,需将map定义于http块内并配合nginx -s reload生效;自动更新依赖外部脚本拉取、转换并重载配置。

在 Nginx 中,可以通过 include 指令动态加载外部配置文件,从而实现对恶意 User-Agent 的自动拦截。关键在于:外部文件需为合法的 Nginx 配置片段,且必须被放在 http、server 或 location 块内;Nginx 不支持运行时热重载该文件内容,必须配合 nginx -s reload 才能生效。
准备可被 include 的恶意 UA 规则文件
新建一个纯文本文件(例如 /etc/nginx/conf.d/bad-bots.conf),内容为一系列 if + return 403 或使用 map 映射更高效的方式:
- 推荐用
map方式(性能更好,避免在location中频繁判断):
注意:map 必须定义在 http 块内,不能放在 server 或更低层级。
在主配置中正确 include 该文件
编辑你的站点配置或 nginx.conf 的 http 块,加入:
server {
...
if ($bad_bot) {
return 403;
}
...
}
}
确保 include 行位于 http 块开头或合适位置,且路径可读。Nginx 启动时会一次性读取并解析该文件。
实现“自动更新”需要外部脚本配合
Nginx 本身不会监控文件变化。要达到“自动更新”,需借助定时任务 + 脚本完成三步:
- 从可信源(如 Ultimate Hosts Blacklist、nginx-ultimate-bad-bot-blocker)拉取最新 UA 列表
- 将原始数据转换为合法的
map格式(注意转义正则特殊字符,避免注入) - 生成新文件后执行
nginx -t && nginx -s reload
示例简版更新脚本(/usr/local/bin/update-bad-bots.sh):
安全与性能注意事项
map 是最轻量的方案,比在每个 location 写 if 更可靠;但要注意:
- 正则表达式不要写成
~*curl这样过于宽泛,否则可能误杀正常请求(如含 curl 字样的合法 UA) - 避免在
if中使用复杂正则或嵌套逻辑,Nginx 的if有已知限制和副作用 - 更新脚本应加锁或校验文件变更,防止重复 reload 导致连接中断
- 建议搭配日志字段
$bad_bot记录匹配情况,便于审计











