正则表达式负前瞻为真,然后忽略正则表达式的其余部分

问题描述 投票:0回答:1

我正在使用以下 IIS 重写规则来阻止尽可能多的机器人。

<rule name="BotBlock" stopProcessing="true">
  <match url=".*" />
  <conditions>
    <add input="{HTTP_USER_AGENT}" pattern="^$|\b(?!.*googlebot.*\b)\w*(?:bot|crawl|spider)\w*" />
  </conditions>
  <action type="CustomResponse" statusCode="403" statusReason="Forbidden" statusDescription="Forbidden" />
</rule>

目标是阻止所有带有部件机器人、爬虫或蜘蛛的用户代理,但允许 Google 机器人。这在一定程度上有效。但问题是,即使在字符串中找到“googlebot”,正则表达式的第二部分也会被触发。

下面一些例子的含义:

 Googlebot/2.1 (+http://www.google.com)

工作正常,googlebot 中的“bot”部分被忽略并且请求被允许。

 Googlebot/2.1 (+http://www.google.com/bot.html)

不起作用,仍然在字符串中的第二个“机器人”上触发,并且请求被阻止

 KHTML, like Gecko; compatible; bingbot

工作正常,在 bingbot 中的机器人上触发并且请求被阻止

那么有人可以帮我更改 rexeg 以便允许带有

Googlebot/2.1 (+http://www.google.com/bot.html)
的字符串吗?

asp.net regex iis url-rewriting url-rewrite-module
1个回答
0
投票

我不熟悉 IIS 的确切正则表达式风格,但是如果您可以启用不区分大小写的正则表达式,则此 应该 可以工作:

^(?!.*googlebot)(?=.*(?:bot|crawl|spider)).*

说明:

  • ^
    - 起始线锚点
  • (?!.*googlebot)
    - 在我之前,“googlebot”这个词不存在
  • (?=.*(?:bot|crawl|spider))
    - 在我面前,存在“机器人”、“爬行”或“蜘蛛”这个词
  • .*
    - 捕获整行(在 IIS 规则的上下文中可能没有必要)

负前瞻和正前瞻的组合会在正则表达式中产生隐式

and
条件;两者都必须为 true 才能使正则表达式注册匹配。

https://regex101.com/r/MFKKyU/1

© www.soinside.com 2019 - 2024. All rights reserved.