You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

请求协助:如何通过请求头阻止Nginx全站访问并拦截特定UA的批量IP连接

请求协助:如何通过请求头阻止Nginx全站访问并拦截特定UA的批量IP连接

嗨,看起来你在尝试拦截带有CensysInspect用户代理的批量IP请求时,碰到了Nginx配置的报错问题,我来帮你梳理下问题根源和正确的解决办法~

首先先明确你的场景:你发现多个不同IP的请求都使用了相同的CensysInspect UA,想要拦截这些请求,日志示例如下:

199.45.154.146 - - [23/Jun/2024:20:52:13 +0500] "GET / HTTP/1.1" 200 4505 "-" "Mozilla/5.0 (compatible; CensysInspect/1.1; +https://about.censys.io/)"
206.168.34.54 - - [22/Jun/2024:01:31:41 +0500] "GET / HTTP/1.1" 403 117 "-" "Mozilla/5.0 (compatible; CensysInspect/1.1; +https://about.censys.io/)"

咱们先来分析你之前尝试的两种配置为什么会报错:

第一种配置的问题

你第一次写的配置:

map $http_user_agent $blocked_user_agents {
    default 0;
    "~*CensysInspect" 1;
}
deny if $blocked_user_agents;

触发的错误是:nginx: [emerg] invalid number of arguments in "deny" directive in /etc/nginx/nginx.conf:27

问题出在deny指令的用法上——deny是用来指定要拒绝的IP/IP段的,比如deny 192.168.1.1;,它不能直接跟if条件搭配使用,你把指令的用途混淆啦。

第二种配置的问题

你第二次尝试的配置:

if ($http_user_agent ~* "censys") {
    return 403;
  }

触发的错误是:nginx: [emerg] "if" directive is not allowed here in /etc/nginx/nginx.conf:22

这个错误是因为你把if指令放在了不允许的上下文里。Nginx的if指令只能用在server块或者location块内部,如果你把它放在了http块根目录或者events块里,就会触发这个报错。


正确的配置方案

这里给你两种可行的配置方式,按需选择:

方案一:用map + return(推荐,高效且适合复杂规则)

map指令需要定义在http块里,然后在server或者location块里使用变量判断,配置示例:

http {
    # 你的其他http级配置(比如include mime.types;之类的)

    # 定义map,匹配UA里的CensysInspect,大小写不敏感
    map $http_user_agent $block_censys {
        default 0;
        ~*CensysInspect 1;
    }

    server {
        listen 80;
        server_name your-domain.com;

        # 在server块内添加判断,拦截匹配的请求
        if ($block_censys = 1) {
            return 403;
        }

        # 你的其他server配置(比如root、location等)
        location / {
            root /var/www/html;
            index index.html;
        }
    }
}

方案二:直接在server/location内用if判断(简单场景快速实现)

如果只是简单拦截这个UA,直接把if指令放在server块里就行,示例:

server {
    listen 80;
    server_name your-domain.com;

    # 直接在server块内判断UA,匹配就返回403
    if ($http_user_agent ~* "censysinspect") {
        return 403;
    }

    # 你的其他server配置
    location / {
        root /var/www/html;
        index index.html;
    }
}

额外小贴士

  1. 每次修改配置后,先执行nginx -t检查语法是否正确,没问题再重启Nginx,避免服务中断。
  2. 如果之后需要同时拦截特定IP和UA,可以把deny指令(用来拦IP)和UA判断结合起来使用。
  3. Nginx官方文档提到if指令有一些“坑”,复杂场景下优先用map或者rewrite规则来替代,避免出现意外行为。

备注:内容来源于stack exchange,提问作者dr.ipkins

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.16 10:53:09