先给结论:robots.txt 的路径匹配大小写敏感,而 URL 路径在多数 Web 服务器上同样区分大小写,所以真正要统一的不是 robots.txt 里那几行,而是“服务器实际提供的路径”和“robots.txt 里写的路径”之间的映射。如果服务器把 /Private/ 和 /private/ 都指向同一份内容,而 robots.txt 只写了其中一个,另一个就不会被该规则覆盖。统一映射的正确做法是:让 robots.txt 的路径与服务器上真实可访问、且会被内部链接或站点地图引用的规范路径完全一致;若服务器本身做了大小写不敏感的映射,必须在 robots.txt 中把每个实际变体都列出,或干脆改服务器让路径唯一。
这是决定后续动作的分叉点,判断依据必须来自服务器行为,而不是直觉。
/Docs/ 和 /docs/ 是两个不同资源,很可能一个返回 200、另一个返回 404。robots.txt 只需匹配真实存在的那个路径,多写另一个没有意义,也不会误伤。Disallow: /docs/,/Docs/ 依然可被抓取,尽管用户看到的是同一页。区分方法很直接:对同一路径的不同大小写变体各发一次请求,看状态码是否一致。若一致且内容相同,说明服务器做了归一;若一个 200 一个 404,说明路径本身唯一。这个结果决定你接下来是“只对齐一处”还是“列出全部变体”。
不要以 robots.txt 为基准去改服务器,也不要凭记忆写规则。按下面顺序做:
这个动作的结果会直接影响下一步:如果收集阶段发现大量变体来自旧链接而非服务器归一,那么问题根源在链接而非 robots.txt,改规则只是掩盖症状;如果变体确实由服务器归一产生,那么 robots.txt 必须穷举,否则规则永远漏掉一部分。
假设某站点有目录 /Assets/,服务器不区分大小写,页面里既有 /Assets/img/ 也有 /assets/img/ 的引用。管理员在 robots.txt 写:
Disallow: /assets/
直觉上以为整个目录都被挡住。但爬虫请求 /Assets/img/ 时,路径前缀与规则不一致,规则不生效,该路径仍会被抓取。反过来,若管理员写的是 Disallow: /Assets/,则 /assets/img/ 同样漏网。只有当服务器把两种写法都重定向到同一规范路径,或者 robots.txt 两条都写,覆盖才完整。这个例子的意义在于:现象与直觉相反,但原因不是规则写错,而是匹配基准与服务器行为不一致。
穷举变体只是权宜之计,它有两个明显代价:规则变长、维护困难,且一旦新增变体又会漏。更稳妥的做法是让服务器把非规范大小写 301 到规范路径,这样 robots.txt 只需匹配一处。但要注意例外:
另外,站点地图不保证收录,把规范路径写进站点地图只是帮助发现,不构成收录承诺。不同搜索引擎对路径匹配和大小写的处理也可能有差异,涉及具体引擎时应分别核查其文档,而不是假设行为一致。
统一之后,用可核对的证据确认,而不是凭感觉。选取每个曾被引用的变体,逐一请求并对照 robots.txt 规则判断是否被覆盖;同时检查内部链接和站点地图中是否还残留非规范写法。若某个变体请求量或抓取量下降,不能单独证明处理正确——它也可能是链接被移除、页面被合并或抓取预算变化的结果。把请求状态、规则匹配和链接来源三者放在一起看,才能区分是映射生效还是其他原因造成的现象。根据验证结果,再决定是补充规则、修正链接,还是转向服务器层归一。