我正在使用以下 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)
的字符串吗?
我不熟悉 IIS 的确切正则表达式风格,但是如果您可以启用不区分大小写的正则表达式,则此 应该 可以工作:
^(?!.*googlebot)(?=.*(?:bot|crawl|spider)).*
说明:
^
- 起始线锚点(?!.*googlebot)
- 在我之前,“googlebot”这个词不存在(?=.*(?:bot|crawl|spider))
- 在我面前,存在“机器人”、“爬行”或“蜘蛛”这个词.*
- 捕获整行(在 IIS 规则的上下文中可能没有必要)负前瞻和正前瞻的组合会在正则表达式中产生隐式
and
条件;两者都必须为 true 才能使正则表达式注册匹配。