可以这样尝试:
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?)