插件窝 干货文章 Nginx禁止部分UserAgent访问的问题解决

Nginx禁止部分UserAgent访问的问题解决

Nginx 恶意 配置 return 965    来源:    2025-04-01

Nginx 禁止特定 UserAgent 访问的解决方案

问题描述

当需要阻止某些特定的 UserAgent(如恶意爬虫、扫描工具等)访问网站时,可以通过 Nginx 配置实现。

解决方案

方法1:使用 if 条件判断

在 Nginx 配置文件中(通常在 serverlocation 块中)添加以下内容:

if ($http_user_agent ~* (恶意UA1|恶意UA2|恶意UA3)) {
    return 403;
    # 或者 return 444; (Nginx特有的直接关闭连接)
}

方法2:使用 map 指令(适用于大量UA规则)

map $http_user_agent $badagent {
    default         0;
    "~*恶意UA1"     1;
    "~*恶意UA2"     1;
    "~*扫描工具"    1;
    # 可以继续添加更多
}

server {
    # ...其他配置...

    if ($badagent) {
        return 403;
    }
}

方法3:结合正则表达式批量匹配

if ($http_user_agent ~* (wget|curl|httrack|nikto|sqlmap|nmap|zgrab|python-requests)) {
    return 403;
}

实际应用示例

server {
    listen 80;
    server_name example.com;

    # 禁止特定UserAgent访问
    if ($http_user_agent ~* (SemrushBot|AhrefsBot|MJ12bot|DotBot|Baiduspider|YandexBot)) {
        return 403;
    }

    # 禁止空UserAgent
    if ($http_user_agent = "") {
        return 403;
    }

    # 其他正常配置...
    location / {
        root /var/www/html;
        index index.html;
    }
}

注意事项

  1. 性能考虑:大量复杂的正则匹配可能影响性能,建议将最常遇到的恶意UA放在前面
  2. 测试配置:修改配置后使用 nginx -t 测试语法
  3. 重载配置:测试无误后使用 nginx -s reload 重载配置
  4. 日志监控:可以在 access.log 中监控403请求,验证规则是否生效
  5. 误拦截风险:某些合法爬虫(如Googlebot)可能有类似名称,需谨慎设置规则

高级技巧

如果需要记录被拦截的请求,可以修改为:

if ($http_user_agent ~* (恶意UA)) {
    access_log /var/log/nginx/bad_agents.log;
    return 403;
}

这样可以在单独的日志文件中记录所有被拦截的请求,便于后续分析。