客户是做职业培训的,站上线一年,百度收录一直稳定在 800 多条。

11 月 3 号早上他打来电话,说收录掉到 200 出头。我打开百度搜索资源平台看了一眼,抓取正常,没有降权警告,也没有安全风险提示。再用 site: 查了一遍,确实是少了,不是被屏蔽。

我把 sitemap 拉出来跟实际收录对比了一下。sitemap 里 800 多条 URL,百度只收了 200 多。缺的主要是两类:所有带参数的列表页,还有三分之二的文章详情页。

第一反应是 canonical 出问题了。

扒首页源码的时候果然找到了第一个坑。首页的 canonical 写的是 https://www.xxx.com,但客户的域名是 xxx.com,不带 www。

这意味着什么。用户访问 xxx.com 的时候浏览器不跳转,页面直接渲染,canonical 却说"我的正式版本是 www 那边"。而 www.xxx.com 有没有内容?有。服务器两个域名都解析到同一台机器,nginx 没做任何跳转。

百度就懵了。它先抓 xxx.com,看到 canonical 指 www,又去抓 www.xxx.com,看到那边 canonical 指自己。两个版本都活着,都觉得自己不是正式版本。

这种情况百度的处理方式是:先观察一段时间,两个都当"未选定规范网页"排除。等了几周还是没有一个明确的信号,最后可能一个都不收。

我让客户去阿里云控制台看了 DNS,xxx.com 和 www.xxx.com 两条 A 记录都指向同一台服务器。宝塔面板里也没配强制跳转。

这是第一个问题。

第二个问题在列表页。我打开 /courses?category=it 这个页面,canonical 写的是 https://www.xxx.com/courses。也就是说所有分类列表页的 canonical 全部指向父页面。

开发当初可能是这么想的:列表页内容差不多,都归到主页面比较安全。

但搜索引擎不这么看。既然你亲口说"我的正式版本是 /courses",那 /courses?category=it 这个页面自然就不需要收录。/courses?category=design 同理。结果 200 多个分类列表页,全被 canonical 自己排除掉了。

我去搜索资源平台的索引页面看了一遍,果然有几百条"已排除-重复网页,用户未选定规范网页"。

第三个问题在分页。分页的 canonical 一律指向第一页。比如 /courses?category=it&page=3 的 canonical 是 /courses?category=it。

这也是老毛病。开发觉得分页是同一个列表的翻页,canonical 指向第一页合理。

但搜索引擎官方文档里明确写过:分页的每一页都应该 canonical 指向自身,用 rel="next" 和 rel="prev" 标记页与页的关系。因为分页里有独立的内容,是列表的不同部分,不是重复内容。

更糟的是,百度对带参数的分页抓取预算本来就小,canonical 又指向第一页,它干脆就不抓了。

第四个问题最难发现。有两篇文章的 URL 是 /blog/seo-guide 和 /blog/seo-guide/,带斜杠和不带斜杠都能打开,内容一模一样,但两个页面的 canonical 都没写。

没有 canonical,搜索引擎就不知道这俩是同一篇。它把两个都抓了,然后发现内容重复,又不知道保留哪个。最后可能两个都不收,也可能随机收一个。

我把 sitemap 和站内链接都过了一遍,发现站里有 30 多篇文章都有这个问题。有些是开发写死的,有些是从别的系统迁移过来时没清理。

四个问题加在一起,收录从 800 掉到 200 就不奇怪了。

修复过程分五步。

第一步,nginx 做 301。把 www.xxx.com 和 http://xxx.com 全部 301 到 https://xxx.com。静态资源路径和白名单路径不动。

第二步,改 canonical。首页改成 https://xxx.com/,所有页面统一用不带 www 的地址。

第三步,列表页和分页。列表页 canonical 指向自身,分页 canonical 也指向自身,同时加 rel="prev" 和 rel="next"。

第四步,统一尾斜杠。选一种风格,全部统一。客户选了不带斜杠,nginx 里加一条规则,带斜杠的 301 到不带斜杠的版本。要注意静态资源路径要排除。

第五步,更新 sitemap。sitemap 里的 URL 全部换成最终的正式版本。canonical 和 sitemap 指向不一致的时候,搜索引擎会浪费大量时间在"到底哪个对"上。

改完是 11 月 8 号。当天做了两件事。

第一件,百度搜索资源平台,重新提交 sitemap,然后用抓取诊断让百度重新抓了首页、一个列表页、一个分页。

第二件,去 Google Search Console 看覆盖率变化。

百度这边恢复得慢。11 月 15 号收录回到 350,11 月 22 号 600 出头,12 月 1 号稳定在 720 条左右。基本回到之前的水平。

Google 那边快很多。GSC 里 11 月 12 号覆盖率就基本恢复了。

客户问我,为什么百度慢这么多。

我说两点。第一,百度重新评估 canonical 需要时间,它要看你几周内 URL 结构是不是稳定,改完立刻就好是不可能的。第二,百度对 HTTP 跳转的处理比 Google 保守,第一次跳转它会重新确认,确认几次稳定了才更新索引。Google 因为爬取频率高,看几次就决定了。

客户又问,那最简单的做法是什么。

我说三个原则。

一个 URL 只对应一个页面。有 www 就不要同时有没有 www 的版本,有斜杠就不要有没斜杠的版本,HTTP 全部 301 到 HTTPS,参数版本 301 到静态化版本。不能同时存在两个都能打开的 URL。

canonical 指向自身。除了极少数情况(多语言翻译页、聚合页),canonical 都应该指向当前页面自己的正式地址。不要为了"集中权重"把子页面的 canonical 指向父页面。

sitemap、canonical、内链三处地址一模一样。sitemap 里写 https://xxx.com/blog/seo-guide,canonical 里也写这个,内链跳转也指向这个。不能一个带 www,一个不带,一个带斜杠。

客户走的时候说了一句话:原来 SEO 不是搞内容,是把基础做对。

我说内容也重要,但基础不对,内容做得再好搜索引擎也读不到。

这个误区很普遍。很多站长把精力全放在内容上,每天更新文章,忽略了 URL 结构和 canonical 这种技术细节。实际上百度收录出问题,十有八九是技术问题,剩下的才是内容问题。而技术问题里很大一部分是"内容明明写好了,但结构让爬虫读不到"。

顺序搞反了。

最后说个小事。帮客户改完站的当天晚上,我用同一套工具扫了一遍自己的站。发现自己站也有两个页面的尾斜杠没统一,当天就改了。

这种问题不难查,只是容易忽略。建议每三个月扫一遍。工具推荐两个:百度搜索资源平台的抓取诊断,能看百度抓到的实际 URL;Google Search Console 的"覆盖率"报告,能看"已排除"的页面具体原因。