先给结论:如果同一份内容因为路径大小写不同被爬虫当成两个地址抓取,你要在“保留多份、改写内部链接、退出旧路径”之间做一次取舍。最稳妥的通用做法是让服务端把大小写变体统一映射到唯一规范路径,返回永久重定向;但如果变体路径已经被大量外部链接指向,直接退出会损失信号,此时保留并映射更合适。判断依据不是爬虫日志里某个变体的请求量是否归零,而是变体是否仍被引用、是否参与站内跳转、以及服务器能否稳定区分大小写。
路径大小写差异通常出现在三类环境:Linux 文件系统区分大小写,Windows 与部分对象存储不区分;URL 规范本身区分大小写;应用路由可能又做了不区分处理。三者叠加时,爬虫请求 /Guide/Page 和 /guide/page,服务器可能返回同一内容,也可能返回两个不同页面。
区分方法很直接:对每个变体分别看 HTTP 状态码、最终 URL 和页面正文是否一致。如果两个变体都返回 200 且正文相同,说明服务器没有做规范映射,爬虫会各自抓取;如果其中一个返回 301 并落到另一个,说明映射已经存在,问题可能只是内部链接仍在混用。注意,抓取量或某个变体的请求数下降,不能单独证明映射正确,它也可能只是爬虫暂时降低了该路径的抓取频率。
当变体路径已经被外部链接、历史分享或旧版站点地图引用时,保留是合理选择。做法是在服务端或反向代理层配置规则,把所有大小写变体永久重定向到唯一规范路径,并确保重定向是单跳而不是链式跳转。这样做的实际结果是:爬虫再次遇到旧变体时会跟随到规范地址,外部链接的信号也能继续传递。下一步应检查站内模板和站点地图是否只输出规范路径,否则映射会被新产生的大小写混用不断稀释。
如果变体只来自站内链接拼写不一致,且没有外部引用,可以优先改写。把导航、面包屑、分页、结构化数据里的链接统一为规范路径,再让旧变体返回 404 或 410。适用前提是你能确认这些变体没有被外部页面引用,否则退出会让原本可用的入口失效。动作完成后,观察爬虫对旧变体的请求是否转为规范路径;如果旧变体请求持续存在,需要回头排查是否还有未清理的引用,而不是急着下结论。
只有当变体从未被公开引用、也不参与任何跳转时,直接退出才成立。退出不等于删除内容,而是让旧变体不再作为可访问地址存在。这里要避免一个常见误判:robots.txt 里禁止抓取某个变体,并不等于它会被可靠地从索引中移除,限制抓取和移除索引是两件事。若目标是让变体不再出现,永久重定向或返回明确的不可用状态通常比单纯禁止抓取更可控。
很多站点把映射规则写好了,却忽略了规范路径自身可能变化。假设规范路径是 /Docs/API,某次改版把它改成 /docs/api,那么之前指向 /Docs/API 的重定向会反过来指向新地址,形成新的变体。假设例子:旧规则把全部小写映射到 /Docs/API,改版后规范路径改为 /docs/api,此时需要同时更新映射目标,否则爬虫会在两个地址之间来回跳转。这个例子只用于说明比较方法,不代表任何真实站点。
因此映射前要先固定一个规范路径,并把它作为唯一输出目标写入服务端规则、模板链接和站点地图。站点地图只包含规范路径,不保证收录,但能减少爬虫发现变体的机会。若站点使用 HTTPS,也不代表路径映射就安全无漏洞,证书和重定向是两套独立配置,需要分别核查。
如果验证后发现仍有变体返回 200,说明映射规则没有覆盖该大小写组合,或者应用路由在重定向之前就返回了内容。此时应回到规则顺序排查,而不是继续增加重定向条目。不同搜索引擎对大小写和重定向的处理细节需要分别核查,不能因为一个引擎表现正常就推断全部一致。
最终取舍可以归纳为:有外部引用或历史价值就保留并映射,只有站内拼写问题就改写后退出,从未公开且无引用才直接退出。把规范路径固定下来,并确保所有输出渠道只引用它,才是避免大小写差异反复出现的关键一步。