对蜘蛛来说,你的页面首先是一串 URL。它并不像人那样“看内容认页面”,而是把能返回正常状态码的地址当成独立目标收进队列。同一份内容如果在好几个 URL 上都能打开,而且都是 200,那它多半会被拆成好几份来抓。重复入口的问题就是这么来的。
重复入口通常从哪冒出来
多数站点并不是故意做出多套 URL,而是被技术细节顺手造出来的。常见的有这几类:
- 带尾斜杠和不带尾斜杠同时可访问,例如 /about 和 /about/。
- http 与 https、www 与非 www 之间没有做统一跳转。
- 目录根与默认文件名并存,例如 /list/ 和 /list/index.html。
- 跟踪参数被写进站内链接,例如 utm、ref、from 之类。
- 列表页的排序、筛选、视图切换参数被大量复制成新地址。
- 同一内容同时挂在多个栏目路径下,例如文章既在 /news/ 又在 /topic/。
- 会话 ID、打印版、分享短链残留,还都能正常打开。
它带来的实际影响
这类问题不会立刻让站点出故障,但会持续消耗资源:
- 抓取预算被摊薄。同一份内容占掉多个队列位置,真正需要更新的页面就排得更靠后。
- 内链指向被分散。站内几百条链接如果指向的是三四个不同变体,就很难说清哪个是被推荐的版本。
- 日志不好读。同一个页面在日志里散成好几组地址,判断覆盖情况时容易看错。
- 变体页面内容略有差异时,还容易被当成不同页面处理,而不是同一页的重复。
收敛的具体做法
- 先定一个规范版本,把全站内链统一到它:导航、面包屑、列表、正文、Sitemap 都只出现这一个。这一步最有效,也最容易被忽略。
- 能确定唯一版本时,其余变体直接做 301。跳转目标就是规范地址,不要绕中间页。
- 无法跳转的场景(例如某些参数页仍需保留访问),在页面里用 rel=canonical 指向规范版本。注意它是提示而非指令,需要和 301、内链一起用。
- Sitemap 只列规范 URL。把变体地址写进去,等于主动把它们再送进队列一次。
- 无关参数在服务器层面直接 301 或返回 404,而不是用 robots.txt 屏蔽。
- 定期把服务器日志里的抓取地址和 Sitemap 里的地址对一遍,看还有哪些变体在被频繁抓取。
用一个简单办法自查:把同一篇文章的几个可能地址都打开一遍,看它们最终停在哪一个 URL 上。如果它们各停各的,说明收敛还没做完。
几个容易踩的地方
canonical 指向了抓不到的地址
规范地址本身必须是可抓取、可访问的。指向一个被 robots.txt 屏蔽的路径,或者指向一个 404,等于把提示作废。
用屏蔽代替收敛
把变体页在 robots.txt 里 Disallow 掉,蜘蛛就看不到页面里的 canonical 提示,也没法顺着跳转走到规范版。除了极少数确实不该抓的路径,重复问题优先用 301 和 canonical 处理。
把分页参数也当成重复
分页、翻页参数是蜘蛛走到老内容的通道,不要顺手屏蔽或统一跳转到首页。需要控制的是同一页面的无意义变体,不是有效的翻页路径。
canonical 链式互指
A 指向 B、B 指向 C 这种多跳写法,会拖慢判断速度。直接一步指向最终版本更干脆。多语言、多地区站点用 hreflang 处理对应关系,不要用 canonical 彼此指向。
什么时候需要再复查一次
改版、换域名、上线新的筛选功能、调整 CDN 或跳转规则之后,重复入口很容易重新长出来。把这些时间点记下来,过几周再看一次日志里同一内容的 URL 数量,比一次性处理完更贴近实际。收敛这件事更像是维护习惯,而不是一次性的清理动作。