遇到robots.txt出现重复或冲突信号时,不要直接删掉整个文件。先确认冲突发生在哪一层:是同一文件里多条规则互相覆盖,是多个主机名或协议各有一份文件,还是robots.txt与页面meta robots、X-Robots-Tag、canonical或站点地图给出的信号不一致。处理顺序应是收集抓取证据、判断哪条规则实际生效、只改必要规则,再用抓取测试复查。
第一类是文件内部规则重复。例如同一目录下既有Disallow: /private/,又有更长的Allow: /private/open/。大多数主流爬虫按最长匹配判断,长度相同时Allow通常优先,但不同爬虫实现细节并不完全一致,所以不要依赖模糊写法。
第二类是文件副本重复。同一站点可能通过http://example.com、https://example.com、https://www.example.com分别访问,而每个主机名都有独立的robots.txt。爬虫只读取它当前访问主机下的那份。你看到“规则没生效”,可能只是改错了主机或协议对应的文件。
第三类是跨信号冲突。robots.txt禁止抓取某URL,但页面里又有noindex;或者robots.txt允许抓取,站点地图却包含大量返回404的地址。要记住:robots.txt限制的是抓取,不等于可靠的索引移除。被禁止抓取的页面仍可能因外部链接出现在搜索结果中,只是没有摘要或抓取更新。
观察:先记录你实际请求的完整URL、主机名、协议和返回状态。用命令行或抓取测试工具请求/robots.txt,确认拿到的是200、404还是其他状态。404通常表示没有抓取限制,而不是“文件损坏”。同时查看服务器是否把不同主机名301到同一主机,若没有,重复副本问题就真实存在。
判断:把文件里的每条规则按User-agent分组抄出来,标出路径、Allow或Disallow、顺序。然后拿你要检查的具体URL逐条比对。判断依据是路径匹配长度,不是行号先后。若同一路径同时命中Allow和Disallow,优先看更长匹配;长度相同再按爬虫文档确认优先级。不要凭“写在后面就覆盖前面”下结论。
处理:只保留能表达意图的最少规则。删除重复行,合并同组路径;如果多个主机名确实需要不同规则,分别维护并记录差异。若目标是阻止抓取,用robots.txt;若目标是让已收录页面退出索引,优先用noindex并确保页面可被抓取,而不是只靠robots.txt。若目标是规范重复页面,用canonical或重定向,不要拿robots.txt当canonical替代品。
复查:改完后重新请求每个主机名下的robots.txt,确认返回内容和状态一致。再用抓取测试工具模拟目标爬虫访问被允许和被禁止的URL各一个,核对结果。最后观察服务器日志中该爬虫对目标路径的请求变化,判断规则是否按预期生效。不同搜索引擎对robots.txt的支持和缓存行为须分别核查,不要用一家测试结果推断所有爬虫。
看到robots.txt返回404,有人以为必须补一个文件。其实没有限制需求时,404是合法状态。看到HTTPS就认为抓取信号安全无漏洞也不成立,HTTPS不保证安全无漏洞或排名,它只说明传输层加密。看到页面被禁止抓取却仍在搜索结果中,不要立刻判定robots.txt失效,先确认该结果是否只是无摘要的外链展示。
如果多个信号指向不同目标,例如robots.txt禁止抓取、canonical指向另一个URL、站点地图又提交原URL,应先明确唯一目标:要抓取就放开限制并让canonical和站点地图一致;不要抓取就统一禁止并清理站点地图。处理冲突的核心不是增加更多规则,而是减少互相矛盾的信号。
下一步,选一个你怀疑冲突的具体URL,按上面的清单逐项记录请求结果和规则命中情况,再决定改robots.txt、页面标签还是站点地图。