一聚教程网:一个值得你收藏的教程网站

热门教程

Nginx 中如何通过 nginx.conf 配置拒绝特定 User-Agent 访问

时间:2026-08-27 11:39:49 编辑:袖梨 来源:一聚教程网

最稳妥的做法是用 map 指令在 http 块中统一定义 UA 匹配规则,再在 server 块顶层用 if 判断并返回 403;需注意 map 必须置于 http 顶层、大小写不敏感匹配、默认 0 黑名单 1、白名单显式置 0 且后置,并配合日志增强、IP 限流与路径加固。

最稳妥的做法是用 map 指令在 http 块中统一定义匹配逻辑,再在 server 块顶层用 if 判断并返回 403。这种方式性能好、可维护性强,还能覆盖空 UA、大小写混用等边缘情况。

在 http 块中定义 UA 匹配规则

把以下配置加到 nginx.confhttp { ... } 区域内(注意缩进和分号):

  1. map 必须放在 http 块顶层,不能嵌套在 serverlocation
  2. 使用 ~* 实现大小写不敏感正则匹配
  3. 默认设为 0,黑名单匹配设为 1,白名单(如搜狗爬虫)需显式写成 0 并放在黑名单之后

示例配置:

map $http_user_agent $blocked_ua {default 0;~* (sqlmap|nikto|gobuster|nuclei|acunetix|whatweb|zmap|masscan) 1;~* (python-requests|curl|wget|httpie|Go-http-client) 1;~* (scanner|crawler|exploit|pentest|vuln|hack) 1;~* (^$|^s*$|^-$) 1;~* Sogou web spider 0;}

在 server 块中触发拦截

进入你要保护的站点对应的 server { ... } 块,在所有 location 之前添加:

  1. if ($blocked_ua) { return 403 "Access denied."; }
  2. 不要把这条 if 放进 location 内——某些 fastcgi_passtry_files 可能绕过它
  3. 返回带提示信息的 403,方便日志识别,又不暴露后端细节

增强可观测性与防御效果

单靠 UA 拦截容易被绕过,建议同步做三件事:

  1. log_format 中加入 $http_user_agent $blocked_ua,便于排查误拦或漏拦
  2. 对高频触发拦截的 IP 加限流,例如:limit_req zone=ua_block burst=5 nodelay;(需提前定义 limit_req_zone
  3. 若某 UA 集中扫敏感路径(如 /admin/wp-login.php),可用 location ^~ /admin 单独加严规则

验证配置是否生效

改完配置后必须执行两步:

  1. 运行 nginx -t 检查语法是否正确
  2. curl 模拟目标 UA 测试,例如:curl -H "User-Agent: sqlmap/1.7" https://yoursite.com/ 应返回 403
  3. 确认白名单 UA(如 Sogou web spider)仍可正常访问

热门栏目