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

如何通过Apache限制特定爬虫(如Claudebot)的请求速率而非封禁?能否针对指定User-Agent启用mod-evasive?

如何通过Apache限制特定爬虫(如Claudebot)的请求速率而非封禁?能否针对指定User-Agent启用mod-evasive?

嗨,针对你的问题,我来给你一步步拆解解决方案~

一、关于能否针对指定User-Agent启用mod-evasive?

答案是可以!不过mod-evasive本身没有原生支持按User-Agent过滤的功能,我们需要结合Apache的mod_setenvif模块和条件指令来实现“只对特定爬虫启用mod-evasive”的效果,具体配置步骤如下:

  1. 先确保你已经启用了必要的模块:

    a2enmod setenvif evasive
    

    执行后记得重启Apache生效。

  2. 配置环境变量标记目标爬虫:
    在Apache的配置文件(比如apache2.conf或站点专属的.conf文件)中,先给匹配Claudebot的请求打上标记:

    # 匹配Claudebot的User-Agent,设置环境变量TARGET_BOT
    SetEnvIf User-Agent "claudebot" TARGET_BOT=1
    
  3. 针对标记的请求启用mod-evasive规则:
    用<If>指令包裹mod-evasive的配置,只对带有TARGET_BOT标记的请求生效,这样就不会影响正常用户或其他爬虫了:

    <If "reqenv('TARGET_BOT') == '1'">
        # mod-evasive核心配置,可根据你的需求调整数值
        DOSHashTableSize    3097  # 哈希表大小,默认即可
        DOSPageCount        5     # 1秒内同一页面的最大请求数
        DOSSiteCount        20    # 1秒内同一站点的最大请求数
        DOSPageInterval     1     # 统计请求数的时间窗口(秒)
        DOSSiteInterval     1     # 统计站点请求数的时间窗口(秒)
        DOSBlockingPeriod   10    # 触发限制后,IP被临时封禁的时间(秒)
    </If>
    

    这里的数值可以根据你的服务器承受能力调整——比如如果Claudebot每秒发10次请求,你就把DOSPageCount设为5,超过就会触发临时封禁(但你说不想封禁,其实mod-evasive的“封禁”是临时的,过了DOSBlockingPeriod就会解除,也可以把这个时间设短一点,比如5秒,相当于让它“冷静”一下,而非永久封禁)。

二、为什么你之前用mod_ratelimit没效果?

你之前尝试的mod_ratelimit模块,它的核心作用是限制带宽(每秒发送的字节数),而不是限制每秒的请求次数。如果你要限制的是Claudebot的请求频率(比如每秒最多10次请求),这个模块自然达不到预期效果。

如果你的需求只是轻度限速(而非防攻击级别的频率限制),也可以试试mod_qos模块,它的功能更灵活,直接支持按请求数限速:

# 先启用mod_qos
a2enmod qos

# 标记目标爬虫
SetEnvIf User-Agent "claudebot" TARGET_BOT=1

# 针对标记的请求,限制每秒最多10次请求,允许5次突发请求
<If "reqenv('TARGET_BOT') == '1'">
    QS_LimitRequestRate 10 5
</If>

三、额外小贴士

  • 不管用哪种方案,配置完成后一定要重启Apache,并用apache2ctl configtest检查配置文件有没有语法错误。
  • 可以用curl命令模拟Claudebot的请求来测试配置是否生效:
    curl -A "claudebot" http://你的域名/页面路径
    

备注:内容来源于stack exchange,提问作者Julien B

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.16 09:09:54