别再按语言自动重定向访客了——Hydrogen 的正确做法

2026年8月11日 ·约 6 分钟阅读

你的店铺支持五种语言。一位意大利访客落在了英文首页。服务器要不要悄悄把他弹到 /it/?听起来很贴心。实际上这是对 SEO 伤害最大的做法之一。Shopify、Google 和 2026 年爬虫实测为什么都这么说——以及正确的替代方案是什么。

每个多语言店铺都会问的问题

当一个 Hydrogen 站点支持多种语言(EN / DE / FR / IT / ES)时,这个问题立刻就会出现:

能不能检测访客的语言,然后自动重定向到对应版本?

直觉上的答案是”当然可以”——读取浏览器的 Accept-Language 头或 IP 地理位置,然后服务端 302 到对应语言路径。

但深入研究 Shopify 官方文档、Google Search Central 指南和 2026 年爬虫行为研究后,三方独立来源指向同一个结论:自动重定向是 Bad Practice,Banner 提示才是 Best Practice。

什么是”Locale-Adaptive”页面?

这是解释一切的核心概念。Google 在 Search Central 文档中定义了它:

Locale-adaptive pages change their content to reflect the user’s language or perceived geographic location.

简单说:如果你的服务器对同一个 URL,根据访客的语言或地理位置返回不同内容——或跳转到不同地址,你的页面就是 locale-adaptive 的。

举例:

  • 访客 A(浏览器语言 de)访问 / → 服务器返回 302 跳转到 /de/
  • 访客 B(浏览器语言 it)访问 / → 服务器返回 302 跳转到 /it/
  • 访客 C(无 Accept-Language)访问 / → 得到英文首页

这就是 locale-adaptive 行为。问题在于:Google 爬虫和 AI 爬虫不是普通访客。

Googlebot 实际是怎么抓的

Google 官方说明了三个事实:

  1. Googlebot 默认不发 Accept-Language 请求头——所以你的服务器收到的请求”看起来像”美国英语用户。
  2. Googlebot 的默认 IP 看起来在美国——所以 IP 地理位置检测也会认为爬虫在美国。
  3. Google 可能无法完整索引你的所有语言版本——因为它主要从美国 IP、无语言偏好的角度抓取。

Google 确实在 2015 年后增加了非美国 IP 的分布式抓取Accept-Language 的语言感知抓取——但那是自动检测后选择性启用的。你不能依赖它来保证所有语言版本被发现和索引。

Google 推荐的做法

We continue to support and recommend using separate URLs as they are still the best way for users to interact and share your content, and also to maximize indexing and better ranking of all variants of your content.

— Google Search Central Blog, 2015

也就是说:独立 URL + hreflang 注解——而不是一个 URL 根据来的人自适应。

Shopify 官方的立场

Shopify Hydrogen Localization Detection 文档用一个 Caution 框说得很清楚。无论你用不用 Shopify Markets,这个结论都成立:

官方原文含义
Good“Show a banner asking the user if they want to switch country”用横幅询问用户是否要切换
Bad“The user gets automatically redirected”用户被自动重定向

一个重要的边界:Shopify 并不是说”不要检测 locale”——检测明确可以用于改善用户体验。坏的是拿检测结果做自动重定向

Shopify 列出了三个技术缺陷:

Other drawbacks of this approach are that page caching ignores locale cookies, headers and URL search params. SEO bots tend to origin from the US, don’t have cookies, and will not change their accept-language headers.

翻译过来:

  1. 边缘缓存忽略 locale cookie 和请求头。 Hydrogen 运行在 Oxygen 边缘节点上,边缘会缓存响应。Accept-Language 和 locale cookie 都不是缓存键的一部分——第一个德国访客的 302 被缓存后,后续所有访客(包括美国人)都会被重定向到德语版。
  2. SEO 爬虫来自美国。 爬虫 IP 定位在美国 → IP 检测判定”美国” → 内容偏向英语。
  3. 爬虫不带 cookie。 即使用 cookie 记住用户的语言选择,爬虫来的时候也没有 cookie,重定向逻辑对它们的行为不可控。

Shopify 官方 Demo Store 是怎么做的

Shopify 官方 Hydrogen Demo Store 的 utils.tsgetLocaleFromRequest 函数只从 URL 路径提取 locale——完全不读 Accept-Language 做重定向:

export function getLocaleFromRequest(request: Request): I18nLocale {
  const url = new URL(request.url);
  const firstPathPart = '/' + url.pathname.substring(1).split('/')[0].toLowerCase();
  return countries[firstPathPart]
    ? { ...countries[firstPathPart], pathPrefix: firstPathPart }
    : { ...countries['default'], pathPrefix: '' };
}

Shopify 自己的参考实现就不做自动语言跳转。

2026 年的爬虫行为数据

MERJ 2026 年的研究实测了所有主流搜索引擎和 AI 爬虫的 Accept-Language 行为(发布于 2026 年 3 月,数据截至 2026 年 2 月)。这张表是决定性证据:

爬虫Accept-Language 行为
Googlebot(Gemini 也用)不发。渲染阶段跟随 JS 重定向时会带 en-US
Bingbot(Copilot 也用)不发
GPTBot (OpenAI)不发
OAI-SearchBot (OpenAI)不发
ClaudeBot (Anthropic)不发
PerplexityBot不发
ChatGPT-User有时 en-US,en;q=0.9,有时不发
Applebot按 ccTLD 猜(.com → 不发,.de → de-DE
Baiduspider不发 或 zh-CN,zh-TW
DuckDuckBot不发 或 en-US,en;q=0.8

最危险的边缘情况:渲染阶段

Googlebot 的初始 HTML 抓取确实不发 Accept-Language。但在渲染阶段,当页面中的 JavaScript 触发重定向后,后续请求会继承浏览器实例的默认 Accept-Language: en-US(MERJ 实测观察)。

如果你的重定向逻辑写在客户端 JS 里(比如 React Router 的 client loader),触发链是这样的:

1. Googlebot 抓取 / (HTML,无 Accept-Language)→ 返回英文页(正确)
2. Googlebot 渲染 / 中的 JS → JS 读取 navigator.language
3. 客户端语言重定向逻辑触发 → 跳转到 /en/
4. 索引信号变混乱:初始 HTML 是英文页,渲染后跳走了

这就是为什么即使服务端不做重定向,客户端的语言检测逻辑也可能干扰爬虫索引

AI 搜索让问题更严重

GPT、Claude、Perplexity、Gemini 都在抓取网页用于检索增强生成。它们的 Accept-Language 行为更不可预测:

  • 有些完全不发(安全)
  • 有些发 en-US,en;q=0.9(默认值,不是用户意图)
  • 几乎没有任何 AI 爬虫会根据用户 prompt 的语言动态调整 Accept-Language

When present, Accept-Language is typically default en-US,en;q=0.9. Therefore, Accept-Language based redirects for bots do not reliably improve user experience, introduce content accessibility risks, and can reduce indexing quality for both search engines and LLM retrieval systems.

— MERJ, 2026

自动重定向的完整缺陷清单

如果你仍然坚持自动重定向(按 Accept-Language 或 IP 地理位置),你必须处理全部这些问题:

#问题原因解法
1边缘缓存语言污染Oxygen 缓存 302 响应;第一个访客的语言”污染”所有后续访客Vary: Accept-Language 或对该路由禁用缓存
2用户选择不被记住Accept-Language 没有记忆;手动切回去的用户下次又被重定向加 locale cookie 覆盖层
3深链接不触发检测只在 / 生效;/about 永远不重定向把逻辑搬到全局路由层(复杂度上升)
4302 vs 301 困境301 会把根路径的 canonical 推向某个语言版本;302 多一次往返只能用 302
5Googlebot 渲染阶段干扰渲染用的浏览器实例带 en-US,可能触发客户端重定向排除爬虫 UA(不可靠)
6AI 爬虫语言偏差AI 爬虫发默认 en-US → 被弹到英文 → 非英文内容被忽略维护爬虫白名单(永远滞后)
7额外网络往返/ → 302 → /de/ 多一次 round trip无法消除

结论:问题 1–6 都有”解法”,但每个解法都在增加系统复杂度和维护成本。Banner 方案一次性消除全部七个问题。

Best Practice:Language Suggestion Banner

Shopify 推荐、Google 认可、实现最简单的方案。

工作原理

意大利访客访问 /(英文首页)

服务端正常渲染英文页面(不重定向)

服务端同时计算"推荐语言"(基于 Accept-Language 或 oxygen-buyer-country)

推荐语言传给前端

前端检查:
  ├─ 当前 locale ≠ 推荐 locale?(比如当前英文,推荐意大利语)
  ├─ 没有"已关闭"的 cookie?
  └─ 两者都满足 → 显示 Banner

Banner: "This site is also available in Italiano"
  ├─ [Switch to Italiano] → 跳转 /it/ + 写 cookie
  └─ [Stay in English]    → 关闭 Banner + 写 cookie

下次访问:
  └─ 优先读 cookie → 不再弹 Banner

方案对比

维度自动重定向Banner 提示
Shopify 官方❌ Bad Example✅ Good Example
Google SEO有 locale-adaptive 风险零风险
AI 爬虫索引有偏差风险零风险
边缘缓存需要 Vary 否则灾难无影响
用户体验强制猜测,不可逆用户自选,可逆
实现复杂度高(7 个问题逐一解决)低(一个组件 + 一段 cookie 逻辑)
网络性能多一次 round trip零额外请求

Hydrogen / React Router 实现要点

  1. 服务端推断推荐语言。 在 root loader 里读 accept-languageoxygen-buyer-country(Oxygen 提供 IP→国家映射),映射到支持的 locale,传给前端。不做重定向。
  2. Banner 组件。 一个 <LocaleSuggestionBanner>,检查当前 locale 是否与推荐语言不同,以及是否有”已关闭”cookie。
  3. Cookie 持久化。 用户点”切换”或”关闭”都写 cookie,Banner 不再重复出现。
  4. 保留手动切换器。 无论有没有 Banner,始终提供语言切换器——用户应该随时能按自己的意愿切换语言。

如果你的店面还要处理货币和市场路由,我们的用一个 Shopify 店铺卖向全球指南讲了 Markets 如何组织语言、货币和域名——Banner 就是建立在那套结构之上的。

如果我们不用 Shopify Markets,这个结论还适用吗?

适用。Shopify 官方文档的 “Good Example / Bad Example” 判断写在 Markets 章节下,但底层原因(缓存、cookie、爬虫行为)是 HTTP 和 SEO 层面的,与是否使用 Markets 无关。

大公司如 Amazon、IKEA 不是在做自动重定向吗?

是的,他们确实在做。但他们有专门的 SEO 团队维护爬虫白名单,有基础设施处理 Vary 头和边缘缓存,有预算做持续的爬虫行为监控。对于 Headless Storefront 项目,Banner 方案的投入产出比远高于自动重定向。

意大利访客打开网站看到英文,体验会不会很差?

Banner 可以做得很优雅——页面顶部一行提示,用访客的语言,一键切换。这比”我被传送到一个地方,不知道发生了什么”要好,而且选择权留在了用户手里。从我们在 Headless 项目上的实践看,Banner 的切换效果并不比自动重定向差——想换语言的用户本来就会换,不想换的用户被强制跳转反而是负体验。

推断推荐语言用 oxygen-buyer-country 还是 accept-language?

两个一起用,分层处理:

  • oxygen-buyer-country:IP → 国家(准确度高,但用户可能在用 VPN 或旅行)
  • accept-language:浏览器语言偏好(准确度中等,但反映用户自己的选择)

我们的推荐策略:优先 accept-language(用户的显式偏好更可靠),fallback 到 oxygen-buyer-country

搭建多语言 Hydrogen 店面是很多团队转向 Headless 的初衷之一——转过去之后别忘了,店面事件追踪需要从头重建。

来源

本文于 2026-08-11 基于 Shopify 官方文档、Google Search Central 与 MERJ 2026 年爬虫实测交叉核查。爬虫行为数据截至 2026 年 2 月(MERJ 测试)——搜索引擎和 AI 爬虫行为会持续演化,以官方文档为最终依据。

信息核对

核查日期: 2026-08-11