有些站长会在入口页上做一层判断:访问者是手机就输出一批链接,是电脑就输出另一批。做这个动作的初衷通常是让页面在不同设备上都显得自然,但搜索蜘蛛来抓的时候,它到底算手机还是电脑,会直接决定它看到哪一版。
搜索蜘蛛本身就有两套抓取身份
主流搜索引擎的抓取端通常不止一个:一类是桌面抓取,UA 里会带 Desktop 之类的标识;另一类是移动抓取,UA 里带 Mobile 字样。也就是说,你写的那条 if 判断,在搜索蜘蛛身上并不是恒定成立的——它会从两个入口分别进来,拿到两份可能完全不同的 HTML。
如果分流逻辑只是简单地判断“含 Mobile 就吐移动版,否则吐桌面版”,那么这两次抓取的结果会不一致。后果是:你以为链接已经发出去了,实际只发给了其中一半的抓取端。
移动优先索引下,默认参考的是移动版
现在多数搜索引擎以移动端渲染结果为索引基准。这意味着即使桌面抓取拿到了完整链接,而移动抓取拿到的是残缺版本,最终参与索引的往往还是移动那一版。所以如果把主要链接只放在桌面版本里,实际效果可能和没放差不多。
最省事的验证方法:用移动 UA 请求一次入口页,看返回的 HTML 里有没有你要暴露的目标 URL。没有,就等于没做。
两版差异太大时,麻烦会更多
- 两版的链接数量、锚文本、目标 URL 完全不同,等于给同一个页面提供了两套互相矛盾的信号;
- 其中一版正文几乎是空的,容易被判为低质量页面,抓取频率随之下降;
- 差异越大,越接近“对爬虫和用户返回不同内容”这个定义。
什么时候会踩到 cloaking 的线
按 UA 分流本身不算违规,问题在于分流的目的是什么。如果给搜索蜘蛛一版、给真实用户另一版,比如给爬虫看干净页面、给用户弹跳转或广告,这就是典型的 cloaking。一旦被识别,影响往往不只这一页,可能连带同 IP、同域名下的其他页面一起被降权或减少抓取。
相对安全的边界是:不同版本的内容主体保持一致,只在排版、加载方式上有差异。做不到一致,就不要按 UA 分流。
更稳妥的几种做法
- 入口页输出统一 HTML,链接直接写在服务端渲染的正文里,不依赖 UA、不依赖 JavaScript;
- 确实需要响应式时,用 CSS 控制显示与隐藏,而不是准备两套 HTML;
- 如果一定要按设备分流,让两版里的目标 URL 集合完全一致,只改展示形式;
- 分流规则里给已知的搜索引擎 UA 加白名单,让它们统一走同一个分支,避免被抓取端被误判成普通移动用户。
上线前后的自查清单
- 用桌面 UA 和移动 UA 各请求一次,diff 两份 HTML,看差在哪里;
- 确认返回内容里目标 URL 是否都存在,锚文本是否可读;
- 如果中间有 CDN 或缓存,检查是否设置了 Vary: User-Agent,否则缓存的可能是另一版;
- 翻日志,看移动抓取 UA 的请求量和返回状态码,是否出现大量非 200。
说到底,搜索蜘蛛不是“一个访客”,按 UA 分流相当于同时对着两个访客说话。要么两边说同样的话,要么就别分——这比事后去猜它看了哪一版要省力得多。