我发布了一次 sitemap 更新,其中新增了大约 3,000 个 /en/blog/... 页面。不久之后,我在 Yandex Webmaster 里看到了一个意料之外的模式:Yandex 开始尝试对应的 /blog/... 路径,也就是去掉了 /en 前缀。
如果这些 URL 直接返回 404,就可能出现成千上万次针对不存在路径的无效 crawl。幸运的是,我之前已经配置了从无语言前缀 route 到真实英文 URL 的永久 308 重定向。
这个看起来很小的防御性 routing 层,实际价值比我预想的更大。
我真正观察到的事实
- 我发布了一个包含约 3,000 个
/en/blog/...新页面的 sitemap。 - 随后 Yandex Webmaster 显示,Yandex 正在尝试抓取对应的
/blog/...URL。 - 这些替代路径本来就已经被 308 重定向覆盖。
- 因此请求没有停在 404,而是被发送到预期的
/en/blog/...URL。
这里必须修正我原先文章里的一个说法:我无法证明 Yandex “错误解析了 sitemap”。我确实是在 sitemap 更新后看到了这些异常路径,但时间先后本身不能证明内部原因。搜索引擎可以通过多种 signal 和历史来源发现 URL。没有更强证据时,准确的说法只能是:Yandex 抓取了我没有预期的路径。
这个区别很重要。Crawler 请求了一个奇怪 URL,是观察结果;解释它为什么选择这个 URL,则是另一个需要证据的判断。
为什么 308 重定向在这里有效
我的 redirect 逻辑相当于把短路径当成 localized URL 的永久 alias:
/blog/example-post -> 308 -> /en/blog/example-post这样,即使 crawler 从意料之外的 URL 进入,最终仍会到达我真正希望提供的页面。
308 Permanent Redirect 是永久 HTTP 重定向,并且会保留 request method 和 body。对于 crawler 常见的 GET 请求来说,保留 method 通常不是重点;这次真正有用的是它明确表达“永久重定向”。Yandex Webmaster 当前文档也把 301 和 308 都归类为永久重定向。
这并不意味着从 SEO 角度 308 一定比 301 更好。我的情况只是 308 原本就已经存在,并完成了我需要的任务:让意外 URL 不至于成为死路。
重定向是安全网,不是 sitemap 的修复方案
重定向限制了问题的影响,但并不会让多余 crawl 变成好事。每一次不必要的重定向都多一个 request 和一个 hop。如果规则写得太宽,还可能在你停止追查错误 URL 来源时掩盖 URL 生成 bug。
如果 sitemap 本身包含旧 URL 或会跳转的 URL,正确做法是修正 sitemap,让它指向 final URL。Redirect 应该用来保护旧路径、替代路径或被意外发现的路径,而不是给不严谨的 URL 数据兜底。
我的 sitemap 里原本就使用 /en/blog/...。308 只是让网站在 crawler 从 /blog/... 进入时更有容错性。
现在遇到类似情况,我会检查什么
- 直接打开线上实际部署的 sitemap。 不只相信生成代码,而是检查最终文件并抽查真实 URL。
- 检查最终响应。 计划被索引的 URL 最好直接到目标页面,不要经过可以避免的 redirect chain。
- 测试可预期的替代路径。 如果旧 URL 或无 prefix URL 有永久目的地,mapping 应该明确并保持一对一。
- 避免重定向链。
A -> B -> C比A -> C更难分析和维护。 - 条件允许时,把 crawler 报告和服务端证据对照。 Webmaster 工具很有用,但不一定告诉你 URL 最初从哪里被发现。
- 不要只根据 crawling 推断 ranking。 Crawling、indexing、ranking 和 traffic 是不同阶段。
curl -I https://example.com/blog/example-post
HTTP/2 308
location: https://example.com/en/blog/example-post这是一个说明性的例子。重点是验证准确的 status 和 destination,而不是假设 routing rule 一定正常。
我能得出什么结论,不能得出什么结论
我可以确认,提前存在的 308 重定向让那些意外的 /blog/... 请求没有以 404 结束,而是被发送到了预期 URL。
我不能确认 Yandex 的 sitemap parser 就是原因。我也没有测量 ranking 提升、indexing 改善,或具体“挽回”了多少 traffic。这样说会超过现有证据。
我最终留下的结论更窄,但也更实用:URL 架构应该能够承受系统边界上可预期的错误。 干净的 sitemap 是第一道防线,精确的永久 redirect layer 是第二道。
两者都存在时,一个意外 crawler path 就不那么容易扩散成成千上万个 dead URL。