Nginx可通过User-Agent头识别并拦截恶意客户端,支持黑名单(如wget、sqlmap)、白名单(仅允许主流浏览器)两种模式,配合日志记录与自定义响应头实现轻量级防护,推荐在location块中配置以避免误伤。

Nginx 本身不直接“识别浏览器”,但可以通过 User-Agent 请求头字段判断客户端类型,并据此拦截明显异常或已知恶意的访问行为。这种配置属于轻量级防护,适合应对扫描器、自动化工具、伪造 UA 的爬虫等,不依赖外部模块,开箱即用。
核心逻辑是:匹配可疑 User-Agent 字符串,返回 403 拒绝访问
用 if + $http_user_agent 拦截恶意 UA
在 server 或 location 块中添加如下规则:
if ($http_user_agent ~* "(wget|curl|lynx|libwww-perl|python-requests|masscan|nmap|sqlmap|nikto|dirbuster|gobuster|hydra)") {
return 403;
}说明:
-
~*表示忽略大小写的正则匹配; - 列出的是常见攻击工具或非浏览器类请求的典型 UA;
- 匹配到任意一个关键词,立即返回 HTTP 403(禁止访问);
- 注意:
if在location内使用更安全,避免在server级别误伤正常请求。
拦截已知恶意爬虫和扫描器 UA
可叠加更具体的规则,例如屏蔽知名垃圾爬虫:
if ($http_user_agent ~* "AhrefsBot|SemrushBot|MJ12bot|DotBot|BLEXBot|NetcraftSurveyAgent") {
return 403;
}这类 Bot 通常不遵守 robots.txt,且高频请求,直接拒绝能有效降低日志噪音和资源消耗。
允许主流浏览器,拒绝其余(白名单模式)
如果业务场景严格,只允许真实用户浏览器访问,可用白名单方式:
if ($http_user_agent !~* "(Chrome|Firefox|Safari|Edge|Opera|iPhone|Android)") {
return 403;
}⚠️ 注意事项:
- 此方式较激进,可能误拦部分小众浏览器、微信内置浏览器、小程序 WebView 等;
- 建议先开启日志记录(
access_log /var/log/nginx/blocked-ua.log配合$http_user_agent),观察一周再启用; - 不建议对全站强制启用,更适合管理后台、API 接口等敏感路径。
配合日志便于排查
在对应 server 或 location 中加一行日志记录,方便确认拦截效果:
log_format blocked_ua '$remote_addr - $remote_user [$time_local] '
'"$request" $status $body_bytes_sent '
'"$http_referer" "$http_user_agent"';
access_log /var/log/nginx/blocked-ua.log blocked_ua;然后在 if 规则前加个自定义 header(可选),便于区分:
if ($http_user_agent ~* "(sqlmap|nmap)") {
add_header X-Blocked-Reason "Malicious UA";
return 403;
}不复杂但容易忽略


















