直接拦截空User-Agent是Nginx最基础有效的反爬手段,通过map预定义$no_ua变量识别完全为空、全空白、单短横线及长度≤2的UA,在server块顶层用if($no_ua){return 403}统一拦截。

直接拦截空 User-Agent 是 Nginx 最基础也最有效的反爬手段之一,因为大量扫描器、自动化脚本和恶意爬虫根本不会发送 UA 头,或故意留空来绕过简单检测。Nginx 原生支持精准识别并阻断这类请求,无需额外模块。
识别空 UA 的几种典型情况
空 UA 不只是完全没字段,还包括以下易被忽略的“伪空”情形:
- HTTP 请求中缺失
User-Agent头($http_user_agent为空字符串) - UA 值仅含空白字符(空格、制表符、换行符等)
- UA 为单个短横线
-或其他无意义符号(部分工具默认填充) - UA 长度极短(如
1、x、0),明显非浏览器行为
推荐用 map 预定义变量统一处理
把空 UA 判断逻辑集中到 http 块中,性能高、易维护、避免重复编译正则:
map $http_user_agent $no_ua {
default 0;
~*^$ 1; # 完全为空
~*^[[:space:]]*$ 1; # 全空白字符
~*^-?$ 1; # 空或单个短横线
~*^.{0,2}$ 1; # 长度 ≤2 的字符串(排除正常 UA)
}这段配置会将上述所有异常情况映射为 1,其余视为合法 UA(0)。
在 server 块中拦截并返回合适响应
在站点对应的 server 块内添加判断,建议返回 403 而非 444,便于日志追踪与调试:
if ($no_ua) {
return 403 "No User-Agent provided";
}注意:该规则需放在 server 块顶层(不要嵌套在 location 内),确保对所有路径(包括静态资源、API 接口)都生效。若使用宝塔面板,需手动编辑站点配置,在 server 段开头插入此段。
配合日志验证是否生效
修改 log_format,加入 UA 和标记字段,方便快速确认拦截效果:
log_format main '$remote_addr - $remote_user [$time_local] '
'"$request" $status $body_bytes_sent '
'"$http_referer" "$http_user_agent" $no_ua';之后用 curl -I https://yoursite.com(不带 -H "User-Agent:...")测试,应返回 403;再查 access.log,能看到对应请求的 $no_ua 值为 1,且 UA 字段为空或异常。


















