跨国网站做 GEO(Generative Engine Optimization,生成式引擎优化,即让内容被 AI 引擎抓取并引用)数据隔离,只有一条硬规则:一个 URL 只服务一个地域。地域差异靠独立路径(/de-de/、/en-gb/)、独立 hreflang 和独立结构化数据显式声明,绝不能用 IP 自动跳转来决定返回哪套内容——否则 AI 引擎会把德国站的价格、运费和退货政策答给美国用户。
为什么 AI 会把不同国家的站点内容混着答?
结论:因为决定内容的那一层(IP、Accept-Language)在 AI 抓取端基本是失效的。
GPTBot、OAI-SearchBot、PerplexityBot、ClaudeBot、Google-Extended 这些 AI 爬虫发出的抓取请求不带 Accept-Language 头,出口 IP 集中在北美机房。如果你用服务端重定向或内容替换做地域分流,它们看到的永远是默认站点(多数是美国站),于是被索引、被引用、被复述的就只有美国站的数据。用户问 AI「德国买多少钱」,AI 复述的就是美元价。
第二个原因在 hreflang:/de-de/ 和 /us-en/ 如果没做双向互指,AI 会把它们判成重复内容,只保留一个版本进答案池。
GEO 数据隔离怎么做?四层落地
结论:按「路径 → HTTP 头 → 结构化数据 → 爬虫策略」四层做,每层单独可验证。
1. 路径层。 地域前缀必须写进 URL:example.com/de-de/、example.com/en-gb/、example.com/ja-jp/。不要用 ?country=de 这类参数,AI 对参数化地域页的归并不可靠。每个地域目录配独立 sitemap(sitemap-de.xml、sitemap-gb.xml),sitemap 里用 xhtml:link 标注全部替代版本。
2. HTTP 头层。 每个地域页做自引用 canonical(/de-de/pricing 的 canonical 指向自己);hreflang 双向互指,末尾加一条 x-default 指向全球入口页;响应头返回 Content-Language: de-DE 和 Vary: Accept-Language, Cookie。基于 IP 的 302 跳转要关掉。
3. 结构化数据层。 在 Product/Offer 上写 priceCurrency、areaServed、eligibleRegion;Organization 上写 areaServed、availableLanguage;页面写 inLanguage。价格、税费、配送范围放进结构化数据——AI 引用时优先取这一段,而不是正文里被翻译过的描述。
4. 爬虫策略层。 robots.txt 不按 UA 屏蔽地域目录,每个地域目录都保持可抓;如启用 llms.txt,按地域分节列出 /de-de/、/en-gb/ 等入口 URL。
多语言和多地域有什么区别?
结论:语言不同不等于地域不同,这两层必须分开声明。
en-US 和 en-GB 是同语言、不同地域:货币 USD 对 GBP,退货政策、增值税规则都不同。zh-Hans 和 zh-Hant 则是同地域的语言变体。hreflang 用「语言-地区」两位组合(en-GB、de-DE),只写 en 会被稀释。对应地,英国站 Offer 必须 priceCurrency: "GBP",美国站 "USD"——两个站不能共用一套模板只换文案,否则货币字段会互相污染。
怎么验证 AI 没有串区?
结论:用请求头回放 + AI 提问双验证。
命令行回放:
curl -sL -A "GPTBot" -H "Accept-Language: en-GB" https://example.com/pricing | grep -o 'priceCurrency[^,]*'
再把出口 IP 切到德国节点跑同一条命令,两次必须分别返回 GBP 和 USD。两次都返回 USD,说明第 2、3 层没生效。
然后做 AI 实测:分别用英语和德语向 AI 引擎提问「你们在德国的年费是多少」,记录答案里的价格和引用 URL,检查引用是否指向 /de-de/。串区就回到结构化数据层补 areaServed。
收束
跨国站点的 GEO 隔离顺序不能反:先定 URL 路径,再定 HTTP 头和 hreflang,再定结构化数据字段,最后才是爬虫策略。IP 跳转是这套体系里最大的坑——它对人有效,对 AI 爬虫无效,而 AI 恰好是现在被引用的那批读者。