先给结论:路径大小写导致的 robots.txt 规则失效,通常不是靠“再补一条大写规则”解决的,而是要在生成环节把 URL 路径统一映射成一种规范形式,再让 robots.txt 的规则与规范形式对齐。前提是服务器对路径大小写不敏感,或站点已通过重定向把不同大小写收敛到同一地址;如果服务器把 /A 和 /a 当成两个真实资源返回 200,那么统一映射只能解决规则匹配,不能消除重复页面本身。
拿一个已经出现例外的页面做样本,分别用原始大小写和全部小写请求一次,记录状态码、最终 URL 和响应内容。会出现三类结果,对应完全不同的处理方向。
这一步的产出是一张两列表:样本 URL、实际返回结果。只有第三类占多数时,才需要先做 URL 规范化,而不是急着改规则。
robots.txt 里的 Disallow 和 Allow 是按路径前缀匹配的,大小写是否敏感取决于具体实现,不能假设所有抓取工具行为一致。因此更稳的做法是:不让规则去追各种大小写变体,而是让进入规则的那份路径清单本身只有一种写法。
假设站点后台允许编辑录入路径,且历史上同时存在 /Products/New 与 /products/new。可以按下面的顺序处理:
这个动作的直接结果是:robots.txt 的规则数量下降,且不再依赖“大小写都写一遍”的补丁。下一步该做的是把这份规范路径清单接入站点地图和内部链接检查,否则新页面仍可能带出大写变体。
如果 robots.txt 是手工维护的,大小写问题会反复出现,因为每次新增目录都可能带入新写法。可行的做法是在生成 robots.txt 的脚本里加一层路径规范化函数,例如在输出 Disallow 行之前,对路径统一执行小写转换并去掉末尾多余斜杠。技术示例可以写成这样:把 /Private/ 和 /private 都归一到 /private/,再输出为 Disallow: /private/。
需要留意的边界是:如果服务器确实区分大小写,且 /Private/ 是一个真实存在的独立目录,那么把它小写后写入规则,会漏掉对原目录的抓取限制。这时不能直接套用统一小写,而应改为先消除该目录的大小写双份存在,再统一映射。也就是说,统一映射成立的条件是“路径大小写不产生不同资源”,而不是“所有站点都应该小写”。
改完生成逻辑后,抽一组曾经出问题的 URL,分别检查三件事:robots.txt 中是否存在对应规则、该 URL 是否仍被允许抓取、以及最终被处理的 URL 是哪一个。若规则存在但抓取行为未变,合理解释包括:规则匹配的是跳转前地址、抓取工具缓存了旧文件、或该路径实际由另一条 Allow 规则优先命中。请求量或抓取量下降不能单独证明映射正确,也可能来自发布节奏变化或站点整体流量波动。
还要区分目标:robots.txt 的抓取限制不等于可靠的索引移除,被 Disallow 的 URL 仍可能因外部链接出现在结果中;站点地图也不保证收录。若目标是让重复的大小写变体退出索引,应优先使用重定向和规范标签,robots.txt 只作为抓取预算管理的辅助手段。
面对“个别样本成立、规模化后出现例外”的情况,可以按这个顺序决策:先确认服务器是否区分大小写;再确认 robots.txt 规则实际匹配的是跳转前还是跳转后地址;然后把规范路径固化到生成脚本;最后用一组样本验证抓取结果,并把未通过验证的路径转入重定向或合并流程。只有当服务器不区分大小写、且规则生成源已统一时,直接照搬某一条小写规则才是安全的;否则应先处理真实重复页面,再谈规则映射。