最新下载
热门教程
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
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.conf 的 http { ... } 区域内(注意缩进和分号):
-
map必须放在http块顶层,不能嵌套在server或location里 - 使用
~*实现大小写不敏感正则匹配 - 默认设为
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 之前添加:
if ($blocked_ua) { return 403 "Access denied."; }- 不要把这条
if放进location内——某些fastcgi_pass或try_files可能绕过它 - 返回带提示信息的 403,方便日志识别,又不暴露后端细节
增强可观测性与防御效果
单靠 UA 拦截容易被绕过,建议同步做三件事:
- 在
log_format中加入$http_user_agent $blocked_ua,便于排查误拦或漏拦 - 对高频触发拦截的 IP 加限流,例如:
limit_req zone=ua_block burst=5 nodelay;(需提前定义limit_req_zone) - 若某 UA 集中扫敏感路径(如
/admin或/wp-login.php),可用location ^~ /admin单独加严规则
验证配置是否生效
改完配置后必须执行两步:
- 运行
nginx -t检查语法是否正确 - 用
curl模拟目标 UA 测试,例如:curl -H "User-Agent: sqlmap/1.7" https://yoursite.com/应返回 403 - 确认白名单 UA(如
Sogou web spider)仍可正常访问