插件窝 干货文章 在Nginx中怎么拦截特定用户代理

在Nginx中怎么拦截特定用户代理

Agent 拦截 User server 787    来源:    2025-04-26

在Nginx中拦截特定用户代理(User Agent)

要在Nginx中拦截特定的用户代理(User Agent),你可以使用$http_user_agent变量结合if条件或map指令来实现。以下是几种实现方法:

方法一:使用if条件返回403禁止访问

server {
    listen 80;
    server_name example.com;

    # 拦截特定User Agent
    if ($http_user_agent ~* (恶意机器人|BadBot|SpiderBot)) {
        return 403;
    }

    # 其他配置...
    location / {
        # 正常配置
    }
}

方法二:使用map指令创建变量

map $http_user_agent $bad_agent {
    default         0;
    "~*恶意机器人"   1;
    "~*BadBot"      1;
    "~*SpiderBot"   1;
}

server {
    listen 80;
    server_name example.com;

    if ($bad_agent) {
        return 403;
    }

    # 其他配置...
}

方法三:使用location块匹配

server {
    listen 80;
    server_name example.com;

    location / {
        if ($http_user_agent ~* (恶意机器人|BadBot|SpiderBot)) {
            return 403;
        }
        # 正常配置
    }
}

方法四:记录并拦截(记录日志同时拦截)

server {
    listen 80;
    server_name example.com;

    set $block_user_agent 0;

    if ($http_user_agent ~ "恶意机器人") {
        set $block_user_agent 1;
    }
    if ($http_user_agent ~ "BadBot") {
        set $block_user_agent 1;
    }
    if ($block_user_agent = 1) {
        access_log /var/log/nginx/bad_agents.log;
        return 403;
    }

    # 其他配置...
}

注意事项

  1. 使用~*表示不区分大小写的正则匹配
  2. 多个用户代理可以用|符号分隔
  3. 频繁更新的用户代理列表建议放在单独的文件中通过include引入
  4. 过于复杂的匹配可能会影响性能,建议测试后再上线
  5. 可以考虑结合fail2ban等工具对频繁访问的恶意用户代理进行IP封禁

高级用法:使用geoip模块或lua脚本

对于更复杂的用户代理拦截需求,可以考虑使用Nginx的geoip模块或嵌入lua脚本实现更灵活的拦截逻辑。

希望这些方法能帮助你有效拦截特定的用户代理访问。