使用多个条件阻止 nginx 中的“好”机器人访问某些人类可以访问的禁区 URL

使用多个条件阻止 nginx 中的“好”机器人访问某些人类可以访问的禁区 URL

经过两天的搜索/尝试/失败后,我决定在这里发布这篇文章,我没有找到任何人做同样的事情的例子,而且我尝试的方法似乎也行不通。我试图向不遵守 robots.txt 文件的机器人发送 403(即使下载了几次)。特别是 Googlebot。它将支持以下 robots.txt 定义。

User-agent: *
Disallow: /*/*/page/

目的是让 Google 可以浏览他们在网站上找到的任何内容,但对以下类型的请求返回 403。Googlebot 似乎不断嵌套这些链接,不断添加一个又一个的分页块:

my_domain.com:80 - 66.x.67.x - - [25/Apr/2012:11:13:54 +0200] "GET /2011/06/
page/3/?/page/2//page/3//page/2//page/3//page/2//page/2//page/4//page/4//pag
e/1/&wpmp_switcher=desktop HTTP/1.1" 403 135 "-" "Mozilla/5.0 (compatible; G
ooglebot/2.1; +http://www.google.com/bot.html)"

顺便说一下,这是一个 wordpress 网站。我不希望这些页面显示出来,尽管 robots.txt 信息通过后,它们会停止一段时间,然后又开始爬行。它就是永远不会停止……我确实希望真正的人看到它。正如您所见,谷歌得到 403,但当我自己在浏览器中尝试时,我得到的是 404。我希望浏览器通过。

root@my_domain:# nginx -V
nginx version: nginx/1.2.0

我尝试了不同的方法,使用地图和普通的旧 nono if,它们的作用相同:(在 http 部分下)

地图$http_user_agent$is_bot{
默认0;
~crawl|Googlebot|Slurp|蜘蛛|bingbot|跟踪器|点击|解析器|蜘蛛 1;
}

(在服务器部分下)

位置 ~ /(\d+)/(\d+)/page/ {
如果 ($is_bot) {
返回 403; # 请尊重 robots.txt 文件!
}
}

最近,我必须为一位客户提高我的 Apache 技能,我做了类似这样的事情:

# 阻止真实引擎,不尊重 robots.txt 但允许正确的调用通过
# 谷歌
RewriteCond %{HTTP_USER_AGENT} ^Mozilla/5\.0\ \(compatible;\ Googlebot/2\.[01];\ \+http://www\.google\.com/bot\.html\)$ [NC,OR]
# 必应
RewriteCond %{HTTP_USER_AGENT} ^Mozilla/5\.0\ \(compatible;\ bingbot/2\.[01];\ \+http://www\.bing\.com/bingbot\.htm\)$ [NC,OR]
# msn 机器人
RewriteCond %{HTTP_USER_AGENT} ^msnbot-media/1\.[01]\ \(\+http://search\.msn\.com/msnbot\.htm\)$ [NC,OR]
# 啜饮
RewriteCond %{HTTP_USER_AGENT} ^Mozilla/5\.0\ \(compatible;\ Yahoo!\ Slurp;\ http://help\.yahoo\.com/help/us/ysearch/slurp\)$ [NC]

# 阻止所有页面搜索,其余的可能会通过
RewriteCond %{REQUEST_URI} ^(/[0-9]{4}/[0-9]{2}/page/) [或]

# 或设置 wpmp_switcher=mobile 参数
RewriteCond %{QUERY_STRING} wpmp_switcher=mobile

# 问题 403 / 服务错误文档
重写规则 .* - [F,L]
# 如果匹配则结束

这比我要求 nginx 做的事情要多一些,但原理是一样的,我很难为 nginx 弄清楚这一点。

所以我的问题是,为什么 nginx 会给我的浏览器提供 404 ?为什么它没有通过,正则表达式与我的 UA 不匹配:

"Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/536.5 (KHTML, like Gecko) Chrome/19.0.1084.30 Safari/536.5"

仅基于 UA 就有大量示例需要阻止,这很容易。匹配位置似乎也是最终的,例如,对于普通用户来说,它不会“失败”,我很确定这与我在浏览器中获得的 404 有某种关联。

最重要的是,我还希望谷歌忽略参数 wpmp_switcher=mobile , wpmp_switcher=desktop 很好,但我只是不希望相同的内容被多次抓取。

尽管我最终通过 google 网站管理员工具页面添加了 wpmp_switcher=mobile(需要我注册......),这也停止了一段时间,但今天他们又开始抓取移动部分的内容。

简而言之,我需要找到一种方法让 nginx 强制执行 robots.txt 定义。有人能花几分钟时间帮我指明正确的方向吗?

我真的很感激任何这让我更加认真思考;-)

答案1

我认为解决这个问题的最佳方法是采取多种措施。但其中没有一项措施与拦截机器人有关。

  1. 首先防止 WordPress 生成无效的 URL。

    找出导致这些 URL 生成的原因并解决问题。

  2. 确定 URL 是否可以合理地重写。如果可以,让 WordPress 发送 301 重定向。

    对于其中一些 URL,您可能能够发送 301 重定向到规范 URL。但对于其他 URL,这并不容易,因为 URL 根本没有意义。

    虽然最新版本的 WordPress 会对某些页面发送 301 重定向,但诸如永久链接重定向可以帮助解决 WordPress 所没有的问题。(此插件可能需要更新或一些自定义;请先仔细测试。)

  3. 对于无意义的 URL,提供410

    410 Gone HTTP 响应告知请求者该 URL 不存在且不会再出现,因此请停止请求。搜索引擎可以使用此数据从其索引中删除无效 URL。

    应该执行此操作的示例配置是(先测试一下!):

    location ~ #/page/\d+/page/# {
        return 410;
    }
    

答案2

尝试在你的地图中使用它:

~(crawl|Googlebot|Slurp|spider|bingbot|tracker|click|parser|spider)$ 1;

据我回忆,您需要使用 $ 来终止正则表达式,除非您使用位置 - 值得一试。

答案3

我认为您的第一个定义不起作用,因为您将其放在 User-agent: * 下,而不是 User-agent: Googlebot 下。至少这似乎与我的 disallow 语句有所不同;去想想吧。

我在 robots.txt 中的 User-agent 下添加了以下内容:Googlebot

不允许: /*?

据称,这会阻止抓取任何包含问号的 URL,因为所有 URL 都包含问号,而没有合法的 URL 包含问号,至少在我看来是这样。

我最近遇到了一个非常类似的问题,我也有“&wpmp_switcher = desktop”或“&wpmp_switcher = mobile”,但也有“mobile?pw_post_layout”在这些无意义的嵌套URL抓取中(更多详细信息请访问http://deputycio.com/8013/googlebot-gone-crazy-maybe-not-its-fault希望我没有违反任何政策,因为它与此相关)。此修复是有症状的,所以我仍然对真正的原因感到困惑。此后有没有人发现有关此问题的其他信息?

相关内容