在nginx中阻止“好”的机器人,对于人们可以去的某些禁用URL的多个条件

经过2天的search/尝试/失败,我决定在这里发布,我还没有find任何人做同样的事情,也没有发现我试过的东西好像工作正常。 我试图发送一个403的机器人不尊重robots.txt文件(即使下载了几次)。 特别是Googlebot。 它将支持以下robots.txt定义。

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

其目的是允许Google浏览他们在网站上可以find的任何内容,但是返回一个403作为以下types的请求。 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如果和他们都是相同的:(在http部分下)

映射$ http_user_agent $ is_bot {
默认为0;
 〜爬行| Googlebot | Slurp |蜘蛛| bingbot |跟踪| click | parser |蜘蛛1;
 }

(在服务器部分下)

位置〜/(\ d +)/(\ d +)/ page / {
 if($ 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]
 #msnbot
 RewriteCond%{HTTP_USER_AGENT} ^ msnbot-media / 1 \。[01] \ \(\ + http:// search \ .msn \ .com / msnbot \ .htm \)$ [NC,OR]
 #Sl </s>
 RewriteCond%{HTTP_USER_AGENT} ^ Mozilla / 5 \ .0 \(兼容; \ Yahoo!\ Slurp; \ http:// help \ .yahoo \ .com / help / us / ysearch / slurp \)$ [NC]

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

 #或wpmp_switcher =移动参数集
 RewriteCond%{QUERY_STRING} wpmp_switcher =手机

 #问题403 /服务ERROROCOCENT
 RewriteRule。*  -  [F,L]
 #如果匹配结束

这个问题比我问nginx做的要多一点,但是它的原理差不多,我很难弄清楚nginx。

所以我的问题是,为什么Nginx服务我的浏览器404? 为什么不传递,正则expression式不匹配我的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 =手机,wpmp_switcher =桌面是好的,但我只是不希望相同的内容被抓取多次。

即使我最终通过谷歌网站pipe理员工具页面添加wpmp_switcher = mobile(要求我注册….)。 也暂停了一段时间,但今天他们又回到了移动部分。

所以简而言之,我需要为nginxfind一个强制robots.txt定义的方法。 有人能掏出他们几分钟的生命,把我推向正确的方向吗?

我真的很感谢任何回应,让我觉得更难;-)

我认为这个问题的最佳解决scheme将涉及多个方面。 他们都没有涉及阻止机器人。

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

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

  2. 确定URL是否可以重写。 如果是这样,让WordPress发送301redirect。

    对于这些URL中的一些,您可以发送301以redirect到规范URL。 但是对于其他人来说,URL并不是那么容易,因为这个URL是毫无意义的。

    虽然最近版本的WordPress发送301redirect的一些页面,插件像永久链接redirect可以帮助涵盖的东西,WordPress的不。 (这个插件可能需要更新或者一些定制;首先仔细testing。)

  3. 对于毫无意义的URL,服务410 。

    410 Gone HTTP响应告诉请求者该URL不存在,永远不会回来,所以不要再问了。 search引擎可以使用这些数据从索引中删除无效的URL。

    应该这样做的示例configuration是(首先testing!):

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

尝试在你的地图中使用这个:

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

从我记得,你需要使用$终止正则expression式,除非你使用的位置 – 值得一试。

我相信你的第一个定义不起作用,因为你把它放在User-agent:*而不是User-agent:Googlebot下。 至less,这似乎与我的禁止声明有所不同。 去搞清楚。

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

不允许: /*?

这应该阻止任何包含问号的url被抓取,因为所有这些包含问号,并没有合法的url,至less在我的情况下。

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