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

Nginx层面拦截ChatGPT爬虫但允许其访问robots.txt的配置问题

Nginx层面拦截ChatGPT爬虫但允许其访问robots.txt的配置问题

你遇到的问题其实是Nginx的location匹配优先级和指令执行顺序导致的,我来给你梳理下正确的配置思路,以及为什么之前的尝试没生效。

正确的配置方案(直接可用)

先看最直观的实现方式,核心是利用Nginx的location匹配优先级规则:

# 1. 精确匹配robots.txt,优先处理,允许所有访问(包括GPTBot)
location = /robots.txt {
    allow all;
    log_not_found off;
    access_log off;
}

# 2. 处理网站其他所有请求,拦截GPTBot
location / {
    if ($http_user_agent ~* "gptbot") {
        return 401;
    }
    # 这里放你原本location /的其他配置,比如root、proxy_pass、try_files等
}

为什么这个配置能生效?

Nginx的location匹配优先级是精确匹配(=)> 前缀匹配(^~)> 正则匹配(或*)> 普通前缀匹配,所以当GPTBot请求/robots.txt时,会直接命中第一个精确匹配的location,跳过后面的拦截逻辑;只有请求其他路径时,才会进入第二个location触发拦截。

你之前尝试失败的原因分析

  • location顺序错误:你之前把location = /robots.txt放在了location /后面,而location /会匹配所有请求(包括robots.txt),导致请求先进入拦截逻辑返回401,根本轮不到后面的精确匹配规则。必须把精确匹配的location放在最前面!
  • 嵌套if的坑:Nginx官方不建议在if内部嵌套if,这种写法逻辑容易混乱,而且if指令本身在某些场景下会有意外行为,能避免就避免。

更优雅的map方式(适合多爬虫拦截场景)

如果之后要拦截更多爬虫,用map来管理会更清晰,同样要注意location的顺序:

# 用map定义哪些用户代理需要被拦截
map $http_user_agent $block_crawler {
    default 0;          # 默认不拦截
    ~*gptbot 1;         # 匹配GPTBot则标记为1
    # 可以继续添加其他爬虫规则,比如~*bardbot 1;
}

server {
    # 依然把精确匹配robots.txt放在最前面
    location = /robots.txt {
        allow all;
        log_not_found off;
        access_log off;
    }

    location / {
        if ($block_crawler) {
            return 401;
        }
        # 其他网站配置
    }
}

备注:内容来源于stack exchange,提问作者Álvaro Franz

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.21 15:39:35