站点运营

站点运营:搜索蜘蛛的URL发现,从多语言站点的语言目录与自动跳转谈起

多语言站点的URL发现难点不在蜘蛛,而在于同一份内容存在多个入口却没说清主次。本文从语言目录结构、基于IP或请求头的自动跳转、hreflang的互指与自指、分语言sitemap的整理几个方面,给出一份可照着走的检查清单,帮助蜘蛛稳定抓到你希望被收录的那个地址。

站点运营

站点运营:搜索蜘蛛的URL发现,从多语言站点的语言目录与自动跳转谈起

多语言站点的URL发现,麻烦往往不出在蜘蛛身上,而出在站点自己没把“谁是主、谁是副本”讲清楚。同一篇内容在中英文两套地址下都能打开,蜘蛛遇到多个候选入口时通常只会挑其中一个展开抓取,其余地址既消耗抓取预算,也容易让不同语言版本互相挤压,最后表现成“某个语言版迟迟不收录”。

先定下语言与地区的URL结构

常见做法有三种,选定之后尽量不要再混用:

  • 子目录:example.com/zh-cn/、example.com/en/。权重集中在一个域名,配置与维护成本最低,多数站点适合这种。
  • 子域名:cn.example.com、en.example.com。适合不同地区由不同团队独立运营,但每个子域都要各自维护 robots.txt 与 sitemap,日志也要分开看。
  • 独立域名:example.cn 与 example.com 并存。权重分散,跳转与 hreflang 的配置成本最高,除非业务上确有必要。

需要留意的是,语言代码尽量带地区后缀,例如 zh-cn、zh-tw、en-us,避免把所有中文流量都压到一个 zh 目录里。目录一旦上线并被收录,后期改名意味着要处理成批重定向,越早定越好。

自动跳转是最容易挡住蜘蛛的一环

不少站点会按访客的 IP 归属地或 Accept-Language 请求头做 302 跳转,把用户推到“更合适”的语言版本。这个体验优化本身没问题,问题出在实现方式上:

  • 不要用 JavaScript 的 location.replace 做语言分发。蜘蛛拿到的是一个几乎空白的页面,正文里的链接也就无从发现。
  • 如果确实需要服务端跳转,用 302 而不是 301。301 会被当作永久搬家,一旦判断失误,修正周期很长。
  • 蜘蛛的访问通常来自固定的几个地区,且不带明确的语言偏好。要保证它在任何情况下都能拿到一个完整、可点、可读的页面,而不是被弹回某个目录。
  • 给用户保留手动切换语言的入口,且切换后的地址要能直接复制分享,而不是只存在于 Cookie 或会话里。

hreflang 的三条底线

hreflang 的作用是告诉搜索引擎“这些地址是同一内容的不同语言版本,请按语言展示给对应用户”。写法上最容易出错的三个点是:

  1. 互指:A 页面标注了 B,B 页面也要标注 A,单向标注等于没标。
  2. 自指:每个页面都要包含指向自己的那条 hreflang,漏掉自指会让整组关系失效。
  3. x-default:为无法匹配语言偏好的访客指定一个兜底版本,通常选主站或英文版。

还要清楚一点:hreflang 只解决“该给谁看哪个版本”,并不解决内容重复的合并问题。如果几个语言版本其实是机器翻译的同一段文字,检索表现依然会互相牵扯,这种情况下更该考虑的是要不要收录。

把抓取入口整理干净

语言目录定好之后,入口层面还有几件事值得顺手做掉:

  • 按语言分别生成 sitemap,再用一个 sitemap index 汇总;文件里只放 200 状态、可正常打开的规范地址。
  • robots.txt 不要为了“省抓取”而屏蔽整个语言目录,屏蔽之后蜘蛛连站内链接都看不到,日志里会长期缺少该目录的访问记录。
  • 站内导航与页脚的语言切换链接用普通 a 标签,保持可抓取;不要把切换做成按钮加事件监听。

一份可以照着走的检查清单

  1. 语言目录或子域的命名是否统一,没有中英目录混排。
  2. 用不带语言偏好、不同地区 IP 的请求访问首页,返回的页面是否完整可读。
  3. 任意取一个内容页,检查 hreflang 是否互指、自指、含 x-default。
  4. 查看服务器日志中该语言目录的抓取记录,是否有稳定访问。
  5. 分语言 sitemap 中的地址是否都能返回 200,且与页面里的规范地址一致。
多语言站点的URL发现,本质是把入口收敛到有限、稳定、可解释的几个地址上,让蜘蛛不必猜。结构定得越早,后面要补的窟窿越少。