TL;DR / 核心要点总结
- 三项不是同一类问题。
noindex是硬屏蔽,canonical是把内容归属判给另一个 URL,hreflang从不屏蔽、只告诉引擎这几页是同一内容的语言版本。 - 先分诊再动手。 如果 Google 侧能正常收录和引用、只有 ChatGPT 缺席,这三项大概率不是原因——它们作用于索引层与归属层,解释不了抓取层与表达层。
- 三者藏的地方不一样。
noindex可能藏在响应头或 CDN 规则里,源码里看不到;canonical可能由 JavaScript 注入,不渲染的抓取器读不到。 - 修复顺序固定:
noindex(硬屏蔽)→canonical(归属)→hreflang(关联)。顺序反了,前一项的问题会掩盖后一项。 - 验收只认配置证据。 同一个 URL,用纯 HTTP 头、指定爬虫 UA、渲染后 DOM 各取一次,三者一致才算修好。
一、先分诊:AI 答案里没有你,是哪一层出局?
「AI 不引用我」不是一个问题。按一次请求的顺序拆,页面可能在四层里的任何一层出局:抓取(请求有没有到)、索引(能不能进候选集)、归属(进的是不是这个 URL)、表达(内容能不能被摘走)。
canonical、noindex、hreflang 只作用于后两层中的一部分。先定位出局层,再决定查哪一项;直接上手改配置,很容易把一天花在并不是原因的地方。
| 你看到的现象 | 更可能出局在哪一层 | 这三项要不要查 |
|---|---|---|
site: 搜索里完全找不到这个页面 | 索引 | 要,先查 noindex |
| 搜得到,但 AI 答案里的链接指向另一个 URL | 归属 | 要,查 canonical |
| 中文版本正常,英文版本完全缺席 | 索引或归属 | 要,查 canonical 与 hreflang |
| Google 正常,只有 ChatGPT 里没有 | 抓取或表达 | 基本不用查,先看爬虫放行与正文直出 |
| 被引用了,但答案句选错了段落 | 表达 | 不用查 |
最后两行最容易误判。Google 的 AI 概览与 AI Mode 建在同一套索引上,所以索引层的卫生会同时影响 Google 侧的 AI 答案。
ChatGPT 搜索有自己的抓取与索引。OpenAI 的公开文档把 noindex 定位为阻止在搜索结果里展示链接与标题的开关,但没有把 canonical 与 hreflang 列为检索控制项。
据此能说的只有一句:这三项解释的是「Google 侧也缺席」的那类问题。对「Google 有、ChatGPT 没有」,它们不构成解释,先去看爬虫放行与正文直出。
抓取层与表达层的排查不在本文范围:前者见AI 抓不到、也读不懂,后者见如何让 AI 引用你的网站。
二、noindex:唯一的硬屏蔽,也是最容易被误触的
三者的性质差别决定了排查顺序。noindex 是其中的硬屏蔽:它把页面排除在索引之外,经典搜索与 Google 侧的 AI 答案会同时失效。
它的载体不止一个。页面里的 <meta name="robots">、响应头里的 X-Robots-Tag、以及 CDN 或边缘规则下发的同名字段,效果完全相同,取证位置完全不同。
| 载体 | 在哪里看 | 典型来源 |
|---|---|---|
<meta name="robots"> | 页面源码的 <head> | CMS 模板、测试环境遗留 |
X-Robots-Tag | curl -sI 返回的响应头 | 服务器配置、反向代理 |
| 边缘规则 | CDN 控制台 | 临时下线、区域限制、按 UA 差异化 |
noindex与 robots.txt 会互相掩盖。 想让 AI 不索引,用noindex没问题;但爬虫必须先抓到页面才读得到这个标签。同时用 robots.txt 禁止抓取,noindex永远不会生效,页面仍然留在索引里。- 按 UA 下发的指令最难发现。 同一个 URL 对普通浏览器返回正常页面,对 AI 爬虫返回另一套响应头或状态码,只看源码永远查不出来。
失败指纹按范围就能分:多个不相关页面同时消失,先查边缘规则;只有个别页面消失,先查模板与响应头;只有某个 UA 看不到,就按 UA 逐个取一次响应头。
最直接的两条命令是看响应头与看原始 HTML:
curl -sI https://example.com/page | grep -i x-robots-tag
curl -s https://example.com/page | grep -i 'name="robots"'
再换一个爬虫 UA 取同一地址,对比两次结果。具体的 UA 字符串从爬虫日志或官方文档里取,不要凭记忆拼。
三、canonical:不是屏蔽,是把归属判给别人
canonical 与 noindex 常被并列讨论,但它们不是同一种东西。Google 官方把 rel=canonical 定位为合并重复 URL 的提示,而不是强制指令。写错的结果不是页面消失,而是你主动声明:这一页的代表 URL 是另一个。
四种错法最常见:模板默认值指向首页;跨语言互指;分页与筛选页互相归并;由 JavaScript 注入,导致不渲染的抓取器读不到。
| 错法 | 你会看到 | 为什么难发现 |
|---|---|---|
| 模板默认指向首页 | 大量页面声明「代表 URL 是首页」 | 单页检查时看起来完全正常 |
| 跨语言互指 | 一种语言版本从索引里消失 | 两个版本都能打开,只是一个不参与 |
| 分页、筛选页归并 | 深层内容进不了候选集 | 用户点得到,抓取器把它合并了 |
| JavaScript 注入 | 部分抓取器视为没有 canonical | 浏览器里一切正常 |
改版后集中出现这类问题,成因与排查顺序见迁移与改版后的引用排查。
AI 侧的边界要说清楚。Google 的 AI 界面与经典搜索同索引,这里的归并会间接决定你在 Google 侧 AI 答案里的资格;对自建索引的引擎,公开文档没有说明它们会像 Google 一样执行归并。
所以「canonical 修好了,AI 就会引用我」不是可以承诺的因果。能承诺的只有一条:写错时,你主动把归属交给了另一个 URL。
失败指纹是:页面能打开、能被搜到,但 AI 答案给出的链接是另一个 URL——首页、另一个语言版本,或者去掉参数的版本。看到这个现象再查 canonical,比无条件全站扫一遍更有针对性。
取证分两步:源码里确认 canonical 指向页面自身;再用不执行 JavaScript 的抓取,确认这条标签在原始 HTML 里就存在。跨语言互指的具体修法,见中英文站点的引用落差排查。
四、hreflang:从不屏蔽,只决定哪一版给了谁
hreflang 与另外两项不属于同一类。它既不控制抓取,也不控制索引;它表达的是一组关系——这几页是同一内容的不同语言或地区版本。配置错误的后果是整组标注被忽略,而不是页面从索引里消失。
完整标注要求三件事齐备:每个版本自引用;双向互指,A 指向 B 时 B 也指向 A;整组有一个 x-default。缺任何一项,都可能让整组标注失效。
它和 canonical 的关系最容易出错。canonical 必须指向同语言版本自身;如果 hreflang 声明这几页等价,而 canonical 说代表 URL 是另一个语言版本,两条信号互相矛盾,通常以 canonical 为准,结果是某个语言版本被合并掉。
AI 侧该怎么期待:公开文档没有把 hreflang 列为自建索引引擎的检索输入。所以它不该被当成 AI 可见度的开关。它真正影响的是 Google 侧的语言匹配,以及多个语言版本之间会不会互相稀释。
失败指纹:搜英文关键词,返回的却是中文页面的标题;或者某一语言版本完全没有出现在候选结果里,但页面本身访问正常。
五、三个藏身处:源码、响应头、边缘
三项设置看起来都在页面里,实际可能出现在三个地方,检查方式完全不同。
| 藏身处 | 能看到什么 | 检查方式 |
|---|---|---|
| 原始 HTML | meta robots、link rel=canonical、link rel=alternate hreflang | 查看源代码,不用「审查元素」 |
| 响应头 | X-Robots-Tag、Link | curl -sI,逐个 UA 取一次 |
| 边缘与 CDN | 按路径、地区、UA 下发的规则 | 控制台看规则,或对比不同 UA 的响应 |
有一条纪律要先立住:本地或浏览器里看到的正常,不构成证据。同一个 URL 在不同 UA、不同边缘节点上可能拿到不同的响应头;由脚本注入的标签,在不执行 JavaScript 的抓取器眼里等于不存在。
先用站内工具做第一轮筛查是划算的。免费的 Crawler Access Test 会用多个爬虫 UA 探测同一批 URL,快速看出放行状态与响应差异。但要记住它的边界:它回答「抓不抓得到」,不回答 canonical 指向哪、hreflang 是否成组。
后者仍然要回到源码与响应头里逐条看。工具给的是线索,配置本身才是证据。
六、修复顺序与验收:先硬屏蔽,再归属,最后关联
顺序不是习惯问题,是依赖问题。noindex 没解除,后两项改得再对,页面也不在候选集里;canonical 没统一,hreflang 的整组标注仍然会和它打架。
| 顺序 | 动作 | 通过标准 |
|---|---|---|
| 1 | 解除 noindex 的三个来源 | 三种取法都拿不到 noindex,关键爬虫取到的是正常状态码 |
| 2 | 统一 canonical | 每页指向自身,原始 HTML 里可见,与 hreflang 不冲突 |
| 3 | 修正 hreflang 组 | 自引用、双向、x-default 齐备,且与 canonical 同语言 |
验收时不要把两本账记在一起。索引状态与 AI 答案里的实际引用不是同步变化的两个指标,前者恢复不代表后者立刻跟上。
判断修没修好,看配置证据;判断有没有效果,看引用证据。引用怎么记录,见三关拆解里的测量方法。
行动清单
今天做
- 用
curl -sI取三个代表性页面(首页、一个栏目页、一篇内容页)的响应头,记录X-Robots-Tag与Link - 在源码里确认这三页的
canonical是否指向自身 - 用两个不同 UA 各取一次同一 URL,比对状态码与响应头
本周做
- 抽样一批主要页面,批量确认
canonical自指与noindex缺失 - 检查 CDN 与边缘规则,确认没有按 UA 或地区下发的索引指令
- 多语言站点核对
hreflang三件套:自引用、双向、x-default
本月做
- 把三项检查写进模板验收,新页面发布前自动过一遍
- 建立索引状态与 AI 引用的两本账,分开记录、分开判断
结语
这三项设置的价值,不在于「改完就会被引用」。它们更像资格线:不修,永远没有资格;修了,也只是回到同一起跑线。
真正决定 AI 会不会引用你的,是抓取之后的实体、证据与可摘性。实体怎么写见结构化数据指南,整条路径的顺序见GEO 优化怎么做。
所以排查时别把它们当成增长手段。它们筛掉的是「本来就不该缺席却缺席」的那一类问题,而这一类通常最便宜,也最容易被忽略。
📩 需要帮助?GEO 咨询团队可以为你做什么
三项设置查完仍然缺席,说明问题不在指令层。我们可以把这一步并入一次完整的 SEO 全站诊断,与技术通道、实体层、内容可提取性一起出具。
- 自我屏蔽核查:逐页核对
canonical、noindex与X-Robots-Tag,区分源码、响应头与边缘注入三种来源 - 技术通道体检:AI 爬虫放行、渲染方式与内容一致性一并检查
- 诊断报告:每条发现带现象、证据、影响与修复方向
本文依据 Google Search Central 关于 canonical、noindex 与 hreflang 的官方文档口径,以及 OpenAI 关于 OAI-SearchBot 与 noindex 的官方说明整理。对自建索引引擎的判断以公开文档是否给出明确口径为界,未公开的部分不作推断。本文不含搜索量、引用率或见效周期数据。