可以这样尝试:
RewriteCond %{HTTP_USER_AGENT} (ADmantX|Proximic|Barkrowler|X-Middleton) [NC]
RewriteRule ^ - [F]
这将阻止任何请求,其中
User-Agent 字符串包含
ADmantX,
Proximic,
Barkrowler 或
X-Middleton. 这个
NC flag使其成为不区分大小写的匹配-我不知道在本例中是否严格要求这样做,但通常这应该是区分大小写的匹配,因为
User-Agents (即使来自坏机器人)通常与案例一致。
regex前缀^.* 和后缀.*$ 都是多余的。
正则表达式模式(A|B|C|D) 称为交替。本质上是指A 或B 或C 或D 将匹配。
这个RewriteRule 图案.* 可简化为^ - 这也稍微有效一些,因为您不需要实际匹配这里的任何内容,只需成功即可。
这个L 当F 使用标志-它是隐含的。
<小时/>
UPDATE:
看来
X-Middleton (或者更确切地说
X-Middleton/1) 当到达您站点的所有用户代理字符串通过Ezoic反向代理时,会将其附加到这些字符串中。因此,仅仅基于用户代理头中存在的这个字符串(如上所述)进行阻止是行不通的,因为它将阻止所有请求!
如果X-Middleton 只需附加到UA字符串,并且不会发生进一步的处理,那么理论上您可以在以下情况下阻止请求:X-Middleton 在UA字符串中出现两次(或更多次),以阻止任何请求,其中X-Middleton 在原始请求中发生。
要处理这种情况,您需要创建一个附加规则。例如:
RewriteCond %{HTTP_USER_AGENT} (X-Middleton).*\\1 [NC]
RewriteRule ^ - [F]
\\1 是与第一个匹配的子模式匹配的内部反向引用,即;X-Middleton公司;。因此,只有当字符串;“X-Middleton”;至少发生两次,由任意数量的字符分隔(或无)。
以上将阻止blah X-Middleton blah X-Middleton/1, 但不是blah blah X-Middleton/1 (不区分大小写匹配)。
但是,我希望在开始使用之前看到此类请求的示例访问日志条目(用户代理字符串)。它不应该阻止真实的用户请求,但也可能不会阻止虚假的请求。如果您没有实际的假请求,则可以通过自定义浏览器发送的用户代理字符串(在Chrome的“Inspector”中的“Customize Menu”中的“More tools”中的“Network conditions”或安装用户代理切换器插件)来模拟请求,或使用CURL发出请求,例如。curl -A "<custom-user-agent>" <siteurl> - 你要去的地方<custom-user-agent> 到blah X-Middleton blah 或者别的什么。
我还希望看到到达应用程序服务器的HTTP请求头的完整列表,因为可能有更好的方法来解决这个问题。(我发现中间代理修改用户代理而不提供原始值是不寻常的。尽管,maybe there are no additional options?)