robots txt怎么写:怎样处理重复或冲突信号?先分清规则层级再动手

📍 WDQWDWQD987AAAAA:216.73.217.121
📱 Mozilla/5.0 AppleWebKit/537.36 (KHTML, like Gecko; compatible; ClaudeBot/1.0; +claudebot@anthropic.com)
🔗 /48c2186539ee.html
📄

robots txt怎么写:怎样处理重复或冲突信号?先分清规则层级再动手

处理 robots.txt 中的重复或冲突信号,核心是先把“谁在什么路径下被允许或禁止”逐条列出来,再按最具体的匹配规则决定实际结果。假设一个例子:站点同时写了 Disallow: /private/ 和 Allow: /private/report.html,还从旧域名复制了一份内容相近但路径不同的 robots.txt。此时不能凭感觉判断,而要按爬虫读取到的文件、路径长度和规则具体程度逐项核对。

先确认爬虫实际读到的是哪一份 robots.txt

重复信号最常见来源不是文件内部写错,而是同一站点存在多个可访问版本。例如 https://example.com/robots.txt 与 http://example.com/robots.txt、带 www 与不带 www 的主机名,可能返回不同内容。核查时分别请求这些版本,记录状态码和正文。若某版本返回 404,爬虫会按“无限制”处理;若返回 5xx,不同搜索引擎的临时处理方式可能不同,需要分别查官方文档,不能一概而论。

检查项可以固定为:协议、主机名、端口、路径大小写、是否被重定向。任何一项不同,都可能让爬虫读到另一份文件。判断结果时,以爬虫最终请求到并成功返回的那份为准,而不是以本地编辑器里打开的那份为准。

冲突规则按“最具体匹配”判断,不按出现顺序

在同一个 User-agent 分组内,如果多条规则都能匹配同一路径,通常以路径更长、更具体的那条为准。假设文件里先写 Disallow: /,后写 Allow: /blog/,对 /blog/post.html 而言,Allow: /blog/ 比 Disallow: / 更具体,因此通常允许抓取。反过来,如果只写 Disallow: /blog/,则 /blog/post.html 会被禁止。

常见错误有三种:一是把 Allow 写在 Disallow 后面就以为一定生效;二是用 * 和 $ 时路径写得太宽,误伤其他目录;三是把不同 User-agent 分组的规则混在一起,以为会合并。正确做法是每个分组单独看,组与组之间不互相继承。

重复分组和重复指令要合并检查

同一个 User-agent 在文件中出现多次时,不同实现可能把同名分组视为同一组继续追加,也可能只取其中一组。为了减少歧义,最稳妥的写法是同一 User-agent 只保留一个分组,把该爬虫的所有规则写在一起。若确实需要为不同爬虫设置不同规则,就分别写独立分组,不要在同一组里重复写 User-agent 行。

可以用一个短清单核对:

假设例子:旧文件与新文件同时存在时怎么定位

假设某站点改版后,新 robots.txt 允许抓取 /new/,但旧文件仍可通过备用主机名访问,且旧文件写着 Disallow: /new/。此时先分别请求两个主机名的 robots.txt,确认哪一个返回 200 且内容包含 Disallow: /new/。然后检查页面内链接、站点地图和外部链接是否仍指向旧主机名。若爬虫通过旧主机名进入,就可能读到旧规则。

处理顺序是:先统一主机名和协议,让所有入口指向同一版本;再在服务器层把旧主机名 301 到新主机名;最后重新请求 robots.txt,确认返回内容只有一份且规则一致。判断是否解决,不看“感觉应该好了”,而看请求结果是否只剩一个 200 版本、规则是否不再互相矛盾。

robots.txt 不能替代索引移除

需要特别区分:robots.txt 的抓取限制不等于可靠的索引移除。被 Disallow 的 URL 仍可能因为外部链接或历史记录出现在搜索结果中,只是摘要可能受限。若目标是让页面从搜索结果消失,应结合页面级 noindex、删除内容或使用平台提供的移除工具,并分别核查不同搜索引擎的支持情况。站点地图也不保证收录,它只是提供发现线索。

下一步可以直接做一件事:把当前 robots.txt 按主机名、协议、路径分别请求一遍,把返回正文和状态码并排记录,再标出所有能匹配同一路径的规则,按“最具体匹配”判断实际结果。这样重复或冲突信号会从猜测变成可核对的清单。

图1 图2

nginx