谷歌未显示您的面包屑导航,通常是因为结构化数据代码存在错误。谷歌要求严格遵循 Schema 的 BreadcrumbList 规范(强烈推荐 JSON-LD 格式)。
快速解决步骤:
- 检测: 使用“谷歌富媒体测试工具”扫描您的网页 URL,修复所有标红的语法报错。
- 提交: 确认无误后,在 Google Search Console 中请求重新抓取(通常需要 1 到 2 周的时间生效)。
注:即使代码 100% 正确,最终是否展示仍由谷歌算法根据页面权重动态决定,但确保底层代码 0 错误是基础。

Table of Contens
Toggle未正确添加 Schema结构化数据
很多页面已经做了前端面包屑,但谷歌看的是可解析的 BreadcrumbList。常见问题不是“没写”,而是层级项缺字段、position 顺序不连续、链接不是可抓取 URL、页面可见路径和标记内容对不上、同页存在两套冲突数据。Google 也明确说明:结构化数据要与页面内容一致,才有资格被用于搜索展示;通过测试工具,也不等于一定会显示。
谷歌读懂了吗
页面顶部出现 Home > Category > Page,只能说明前端把一条导航渲染出来了;Google 读到的却是另一套信息:HTML 链接、JSON-LD、Microdata、内部链接关系、canonical、可抓取状态。Google Search Central 对 Breadcrumb 的定义写得很清楚:它表示页面在站点层级中的位置,供搜索系统理解页面路径。Schema.org 也说明,BreadcrumbList 是一串按顺序排列的已链接网页,顺序依赖 position 重建。页面上有 3 级文字,不等于搜索系统已经得到 3 个可用节点。
先看用户端和抓取端的差别。用户看到的是视觉结果,搜索系统拿到的是源码结果。导航组件可能由 React、Vue 或主题模板在浏览器端拼出来,浏览器 0.5 秒后能看到,不代表 Google 在首次抓取时就能拿到同样内容。页面里如果只有前端生成的文字链路,没有稳定输出的 BreadcrumbList,搜索系统需要自己推断路径;一旦目录、分类、参数页同时存在,推断结果就会偏。
再往前一步,很多站点的问题不在“没有显示给用户”,而在“显示层和数据层不是同一条路径”。页面顶部写 Home > Men > Shoes > Running,JSON-LD 输出成 Home > Shoes > Running,源码里还有一套 Microdata 写成 Home > Sale > Running。用户只看得到 1 条,搜索系统却收到 2 到 3 条版本。
Rich Results Test 只能告诉你“哪类富结果可以生成”,不会替你判断 3 条路径里哪一条代表页面真实层级。工具能解析,不等于搜索结果会采用。
这个差异放到真实页面上,通常会出现在下面几种场景里:
页面顶部有面包屑,源码里没有
BreadcrumbList页面源码有
BreadcrumbList,但可见路径与之不一致页面有 4 级路径,结构化数据只写了 2 级
同一页面被主题、插件、应用各输出 1 套数据
中间层级是搜索页、筛选页、参数页,不是正式 URL
最后一级名称与当前页标题差距很大
上面任意 2 项同时出现,Google 解析时就不再是“读一条确定路径”,而是“从多条信号里选一条最像的”。Google 的结构化数据测试页也提醒得很明确:Rich Results Test 看的是 Google 支持的结果能否生成;泛 Schema 校验则要用别的验证器。二者都不负责替搜索结果背书。
可以把“用户看得到”拆成 3 层,再看哪一层没有传到 Google:
| 层级 | 用户端状态 | 搜索系统需要的内容 | 常见断点 |
|---|---|---|---|
| 视觉层 | 顶部出现 3 到 5 级导航 | 不需要样式,需要可解析节点 | 只有 CSS/JS 渲染文字 |
| 源码层 | 页面源码包含链接 | 需要 BreadcrumbList、ListItem、position | 字段缺失、层级不完整 |
| 站点层 | 页面属于目录树 | 需要内部链接、canonical、可抓取 URL 一致 | 目录树混乱、入口多版本 |
一旦视觉层正常、源码层缺失,用户会说“我明明做了面包屑”;源码层正常、站点层混乱时,开发会说“代码测试通过了”;从搜索系统视角看,这两种情况都还没到可稳定采用的程度。
还有一个经常被误解的点:用户在搜索结果里没看到 Breadcrumb,不一定是页面解析失败。Google 已在 2025 年 1 月 23 日开始全球调整移动端搜索结果的 URL 展示方式,手机和平板结果通常只显示域名,不再展示以 > 连接的 URL 层级;桌面端仍可能显示面包屑式路径。
也就是说,移动端“没显示”有时是展示策略变化,不是页面没被理解。排查时至少要区分设备:桌面端看结构展示,移动端先看是否属于 Google 的显示收缩。
这会影响很多站长的判断。用户在桌面端看站内页面,能看到完整路径;再拿手机搜品牌词,只看到域名,于是以为 Breadcrumb 失效。实际上,页面结构化数据可能完全正常,只是移动端 SERP 不再把那条路径显示出来。
判断有没有被读懂,不要只盯着手机结果,要结合源码、测试工具、桌面 SERP、Search Console 里的增强结果状态一起看。Google 的帮助文档没有把“显示”当作必然结果,它说的是“can help users understand and explore a site effectively”,不是“提交就展示”。
从用户视角去理解,最容易出错的是把“看见导航”当成“搜索系统拿到结构”。前者依赖浏览器渲染,后者依赖语义标记和抓取稳定性。一个常见例子:电商页顶部显示 Home > Women > Jackets > Waterproof,但实际 URL 是 /collections/sale/products/x,canonical 指向另一个集合页,JSON-LD 又写成 /women/jackets/。用户点进去觉得路径没问题,因为页面能回到上一级;Google 则会看到 3 组不同的父级关系,站点层级不再固定。
Schema.org 对 BreadcrumbList 的要求里提到“通常以当前页结束”,这里“当前页”如果和 canonical 指向页不是同一对象,路径就会飘。
再看源码层的几个细节,很多都不会影响用户阅读,却会影响机器理解:
position从 0 开始,而不是 1、2、3name写了营销词,不是导航名item指到 302 跳转页页面有 4 级目录,只输出前 2 级
最后一项没有对应当前文档
面包屑随入口不同而变化,A 入口是 3 级,B 入口是 4 级
用户几乎不会因为这 6 项发现异常,搜索系统却要靠它们判断“这是不是一条稳定链路”。Schema.org 文档写得很具体:position 用来重建项目顺序,BreadcrumbList 由已链接网页组成,通常至少要有 URL 和名称。少 1 个维度,机器就少 1 个判断锚点。
还有 CMS 场景。WordPress、Shopify、headless CMS、模板市场主题都可能自动输出一套面包屑,SEO 插件再输出第二套。用户看到的只有模板那一条,Google 抓的是两套甚至三套。第二套如果藏在 <script type="application/ld+json"> 里,第三套来自旧版 Microdata,前端团队平时不会去翻源码,很容易一直以为“用户看见就够了”。等到 SERP 不显示、或 Search Console 报冲突,才发现页面里同一个名称对应了两个不同父级。
可以用一组很短的检查,把“用户看见”和“Google 读懂”分开:
浏览器里看:顶部是否有 3 到 5 级清楚路径
查看源码:搜索
BreadcrumbList出现几次对照当前页:最后一项是否对应当前 URL
查中间层级:每一级是否返回 200,而不是 301/302/404
跑测试:Rich Results Test 是否能识别 Breadcrumb
对照设备:桌面 SERP 与移动 SERP 是否被同样显示
这 6 步里,前 2 步确认“有没有传出去”,中间 2 步确认“传的是不是正式路径”,最后 2 步确认“Google 有没有条件展示”。只做第 1 步,得到的只是用户界面答案。
再补一条常被忽略的细节:Google 推荐先用 Rich Results Test 看页面里哪些 Google 支持的富结果可以生成;如果想做通用 Schema 校验,还要用 Schema Markup Validator。也就是说,页面“通用 Schema 没报错”和“Google 识别到 Breadcrumb”不是同一回事。很多开发只跑了 1 个通用检查器,看到 JSON 合法就停了;实际上 Google 是否识别到 Breadcrumb,要看 Google 自己支持的类型、字段和页面条件。
所以,用户看得到面包屑,只能证明页面界面完成了一半;Google 已经读懂,至少还要满足另外一半:源码里有可解析的 BreadcrumbList,节点顺序和页面路径一致,链接都是正式可抓取 URL,当前页和链尾一致,而且展示设备没有被 Google 的界面策略收缩掉。
字段和层级写错了
很多页面不是完全没加面包屑标记,而是写成了“能被前端显示,不能被搜索系统稳定重建”的状态。Google 的 Breadcrumb 文档要求使用 BreadcrumbList,列表项通常放在 itemListElement 里,每一级用 ListItem 表示;Schema.org 还明确写了,列表顺序要靠 position 重建,而且这条链通常以当前页结束。少 1 个字段,顺序跳 1 位,或者最后一级没落到当前页,代码看起来还能跑,搜索结果里却可能不采用这条路径。
先看最常见的一组错法。页面源码里有 3 级路径,前端显示也是 3 级,但 JSON-LD 只写了 2 个 ListItem;或者一共 4 级,position 却写成 1、2、4、4。Schema.org 对 BreadcrumbList 的说明很:position 用来恢复顺序,默认约定是升序排列。顺序字段一旦重复、跳号、倒序,搜索系统拿到的不是“4 个页面的链路”,而是“4 个名称相近但关系不稳定的节点”。
再往下看,字段错并不只是一两个拼写问题,更多是结构关系没交代完整。下面这 6 类情况出现频率很高:
@type写成了ItemList,没有写BreadcrumbListitemListElement里放的是纯文本,不是ListItem只有
name,没有item有
item,但 URL 指向重定向链、参数页或 404position从 0 开始,或者用字符串乱排最后一级不是当前页,而是上一级分类页
Google 把面包屑描述为“页面在站点层级中的位置”,Schema.org 也把它定义为一串已链接的网页。层级里每一级都要能对应到一个可理解的页面,不是只把名称排出来就算完成。
用户自己排查时,最容易漏掉的是“页面可见路径”和“结构化数据路径”不是同一套。页面顶部写着 Home > Shoes > Running Shoes > Men,JSON-LD 里却输出成 Home > Men > Running Shoes。浏览器里看,两者只差了 1 级;搜索系统里看,站点关系已经变了。Google 在结构化数据说明里写得很清楚,标记是给搜索系统理解内容用的,不是只给测试工具过语法用的。
还有一类问题常出在 CMS、主题和插件叠加输出。一个页面里同时出现 2 套 Breadcrumb 数据,肉眼不容易发现,因为其中 1 套可能在 <script type="application/ld+json"> 里,另一套可能是 Microdata。最终页面给 Google 的不是 1 条路径,而是 2 条不同版本的路径。4 级层级和 3 级层级并存,第二级 URL 不同,最后一级名称不同,系统就要自己判断哪条更可信。Google 的测试页也说明,工具只能看“哪些 Google 支持的结果可以生成”,不是保证展示。
把问题拆到字段层面,会更容易定位。下面这张表可以对照源码检查:
| 检查项 | 正常写法 | 常见错误 | 影响 |
|---|---|---|---|
| 类型 | BreadcrumbList | 写成 ItemList 或别的类型 | Google 不一定按面包屑理解 |
| 列表项 | ListItem | 塞文本或普通对象 | 节点关系不完整 |
| 顺序 | 1,2,3,4 | 1,2,4,4 或 0,1,2 | 顺序无法稳定恢复 |
| 名称 | 与页面导航一致 | 名称简写、换词、错词 | 页面路径对不上 |
| URL | 每级对应真实页面 | 参数页、脚本链接、404 | 中间层级不可用 |
| 终点 | 当前页面 | 分类页或父级页 | 链条没有落到当前页 |
表里每一行都不算复杂,但只要命中 2 行以上,搜索结果不采用 Breadcrumb 的情况就会明显增加。尤其是 3 级以上路径,一旦第二级和第三级位置交换,整条链会偏得很明显。Google 示例里反复强调的就是层级顺序和节点定义,不是装饰写法。
继续往后查,经常会看到“最后一级要不要带链接”这个问题。Schema.org 说这条链通常以当前页结束,Google 的示例里也存在当前页作为最后一项的写法。实操里更重要的不是“最后一级有没有链接样式”,而是“最后一级在数据里是否明确指向当前文档”。页面 canonical 是 A,Breadcrumb 最后一项却写到 B,或者最后一项名称与 <title>、h1 相差很大,系统就很难把当前文档和链尾绑定起来。
可以按下面 3 组去做人工检查,每组 3 到 5 分钟就能发现大部分问题:
看源码
搜
BreadcrumbList出现几次数
ListItem一共有几项检查
position是否连续看最后一级是否对应当前 URL
看页面
顶部导航显示几级
分类名称和 JSON-LD 是否一字不差
当前页名称有没有被缩写
面包屑顺序是否和目录树一致
看链接
每一级 URL 是否返回 200
有没有多跳重定向
有没有参数页替代正式页
有没有把
/category/和/collection/混着用
检查完字段,下一步要看层级是不是“站点真实层级”,不是编辑习惯里的目录。一个产品页可能同时挂在 2 个集合里,一个文章页可能同时属于 3 个 taxonomy。前端为了用户浏览,会显示其中 1 条路径;模板为了偷懒,可能抓最近一次分类关系输出。结果同一页面今天显示 3 级,明天显示 4 级,或者桌面端和移动端不一致。
这也是为什么“测试工具通过”不能说明字段和层级没问题。Rich Results Test 主要检查结构化数据能否生成受支持的结果,也能做预览;它不会替你判断站点 taxonomy 是否合理,不会判断产品页到底该挂在 Men > Running 还是 Sale > Running。代码层面合格,只说明解析没报错;站点关系有没有持续、单一、可重复,还得回到页面本身核对。
给一个很短的判断标准:3 级路径里,至少要同时满足 3 件事——页面上能看到同样的 3 级名称,JSON-LD 里有 3 个连续 position,3 个 URL 都是当前站点里可访问的正式页。缺了其中 1 项,搜索系统就有理由不按你写的那条链来展示。
网站层级结构不清晰
网站层级一乱,最的结果是“找不到上一级、看不懂自己在哪、回不到相关页”。Google 说明面包屑表示页面在站内层级中的位置;URL 也应尽量简单、可理解;内部链接会影响抓取与相关性理解。若同一页面挂在 2 到 4 条路径下,URL、导航、结构化数据三套信息又不一致,Google 往往更难稳定显示 Breadcrumbs。
对照整站信息
很多页面已经写了 BreadcrumbList,Rich Results Test 也能过,但搜索结果里还是不显示,或显示得不稳定。原因往往不在那一段代码本身,而在整站给出的层级信号互相冲突。Google 对 breadcrumb 的说明写得很明确:它表示页面在站点层级中的位置,用户可以沿着路径一层层回到上级页面。代码只是其中一部分,页面可见内容、URL、内部链接、分类页关系,也都在传递同一件事。
Google 对结构化数据的说明也很清楚:标记用于帮助搜索引擎理解页面内容,前台可见内容要和标记保持一致。页面上写 Home > Blog > Technical SEO,JSON-LD 却写 Home > Resources > Search,前台是一套,标记是另一套,搜索引擎拿到的是两份不同的层级说明。就算语法 100% 正确,展示也未必稳定。
“A breadcrumb trail on a page indicates the page’s position in the site hierarchy.” Google 这句话很短,但它讲的是 site hierarchy,不是单独一段脚本。
先看最常见的冲突来源。一个商品页可能同时出现在 Laptops、New Arrivals、Student Deals、Spring Sale 4 个列表里;一个文档页可能同时挂在 Docs、Help Center、Admin 3 个入口下。入口可以有多个,父级不适合跟着变。用户从不同入口进入同一页,如果每次看到的面包屑都不同,页面归属就会反复变化,搜索引擎也更难判断哪条路径才是主路径。Google 文档提供过多条 breadcrumb trail 的示例,但前提是真实、可见、合乎页面关系,不是为了补代码而随意拼接。
再往下看,URL 也是站点级信号。Google 在 URL 结构文档里建议站点使用简单、描述性、便于人理解的 URL。页面如果属于 guides/technical-seo/,URL 却长期留在 /resources/item?id=4839,用户靠 URL 很难判断它在哪一层,搜索引擎也拿不到清晰目录关系。模板、导航、URL 三处只要有 2 处不一致,页面位置感就会变弱。
内部链接也会继续放大这个问题。Google 说明,链接既用于发现页面,也作为相关性信号。站内若有 60% 的入口把某页当教程,另外 40% 又把它当案例,锚文本、上下文、父级页关系会被混合表达。页面本来只该有 1 条主路径,结果在站内被讲成 2 到 3 种身份。这样一来,Breadcrumb 代码即使完全正确,也是在补救已经分叉的站点信息。
可以把 Google 会对照的信号压成一张表,方便排查:
| 信号位置 | Google 能读到什么 | 常见不一致 | 对显示的影响 |
|---|---|---|---|
| 可见面包屑 | 当前页父子关系 | 前台和 JSON-LD 不同 | 路径可信度下降 |
| URL | 目录层级 | URL 很浅,导航很深 | 站点结构变松 |
| 内部链接 | 页面归属与相关性 | 同页被不同栏目反复链接 | 主路径不稳定 |
| 分类页/集合页 | 上一级是否真实存在 | 上级页很薄,只有 3 到 4 个子页 | 父级承接弱 |
| 主导航 | 站点大区划分 | 导航叫法与栏目叫法不统一 | 用户和爬虫都要多判断一次 |
表里每一行都不是额外装饰,而是页面位置的一个证词。5 行里如果有 3 行对不上,搜索引擎看到的是冲突,不是层级。
很多团队会先修 schema,再去看站点结构,顺序往往反了。更稳一点的做法,是先检查页面有没有固定主归属,再决定怎么写 BreadcrumbList。可以按下面 2 组看:
页面级检查
单页是否只有 1 个主父级
点上一级后是否能看到 5 个以上同类子页
当前页标题、URL、面包屑是否讲同一套关系
页面是否被多个一级栏目同时当作直属子页
站点级检查
并列栏目名是否边界清楚
同类模板是否统一输出路径
旧目录迁移后是否残留旧 URL、旧面包屑、旧链接
XML sitemap、导航、正文链接是否都把页面指向同一类集合页
只看代码时,看不到第 2 组问题;而 Google 在抓取和理解页面时,会同时碰到第 1 组和第 2 组。
有一个很常见的站点现象:前台面包屑写得漂亮,但上一级页没有浏览价值。比如 Home > Blog > SEO > Canonical Tags,点回 SEO 后,页面里只有 4 篇旧文章,没有筛选、没有分页、没有相关文章。用户会把这一级当成空壳页,搜索引擎也很难把它当成稳定的父级集合页。父级页如果不存在真实内容承接,面包屑路径就少了一层站内证据。
这类问题在大站里更容易出现,尤其是经历过 2 次以上内容迁移的站。一次改版把 Blog 改成 Learn,下一次又把 Learn 拆成 Guides 和 Insights,旧文章 URL 没完全迁,模板也没统一,正文里还有旧锚文本。结果是一页内容会同时留下 3 个时期的归属线索。用户只会觉得“这个页面像被搬过几次”,搜索引擎读到的则是历史目录残留。
可以用 30 页抽样法快速找问题。抽 30 个深层页面,记录 6 项:URL、可见面包屑、JSON-LD、主导航归属、正文内部链接来源、上一级页内容数量。若有 8 页以上出现 2 项不一致,站点层级信号已经偏散;若有 5 页以上出现 3 项不一致,先收拢站点结构,比继续补代码更有用。30 页的样本不大,但足以看出模板是否统一。
移动端还要多看一次。Google 在 2025 年 1 月开始让移动搜索结果普遍不再显示 URL 的 breadcrumb 路径,只显示域名;桌面端仍可能显示层级路径。手机结果页少了一层外部位置提示,站内自己的路径就更要清楚。如果移动模板又把面包屑隐藏,用户从搜索结果进入深层页后,位置感几乎全部依赖页头和内容上下文。
下面这组情况最容易让人误以为“代码有问题”,其实是站点信息没对齐:
Rich Results Test 通过,但 SERP 不稳定
常见原因:前台与 JSON-LD 不一致
或者父级页本身没有清楚的栏目承接
面包屑偶尔显示、偶尔不显示
常见原因:同一模板下页面父级关系不固定
内部链接把同类页分别送往两个不同集合页
旧路径还在搜索结果里出现
常见原因:历史 URL、历史锚文本、旧模板残留
页面迁移超过 1 次时更常见
再把执行层面压缩一下,会更容易落地:
优先统一 4 个位置
可见面包屑
JSON-LD
URL 模式
站内主入口链接
优先删掉 3 类干扰
只有 3 到 4 个子页的空目录
与相邻栏目只有近义词差别的目录
迁移后仍被大量内部链接引用的旧路径
优先检查 3 类页面
深层产品页
文档页
帮助中心页
这 3 类页面最依赖“上一级是谁”,也最容易因为模板复用和历史迁移留下路径冲突。
还有一点经常被忽略:结构化数据并不是展示承诺。Google 在结构化数据文档里写的是“helps Google understand content”与“eligible for rich results”,不是“写了就显示”。页面被标记成可理解,不等于搜索结果一定采用那条 breadcrumb。站点其他信号如果更混乱,展示就可能被抑制或改写。
所以,处理这类问题时,思路最好从“我的代码有没有错”换成“整站是不是都在讲同一条路径”。当 URL、可见面包屑、内部链接、父级页、主导航都把页面指向同一层级时,Breadcrumb 代码才是在补充说明;前面几项若各讲一套,代码再工整,也只是把冲突写得更规范。
更少的歧义
用户进入深层页面时,先看的不是代码,而是“我现在在哪、上一层是什么、再上一层会去哪”。Google 对 Breadcrumb 的定义也围绕这一点:它表示页面在站点层级中的位置,用户可以沿着路径一层层往上返回。页面如果挂在 3 条路径下,导航写一套,URL 写一套,结构化数据再写一套,用户读到的是 3 个版本的位置说明,搜索引擎读到的也是 3 个版本。
站点里常见的误区不是层级太少,而是层级标签太多、边界太近。一个内容中心里同时放 Guides、Resources、Learn、Insights,内部团队能区分,外部用户往往要多花 5 到 10 秒判断差别。Nielsen Norman Group 长期把“标签是否符合用户语言”和“分类是否贴近用户分组方式”当作信息架构评估重点;用户研究里,卡片分类常用于验证栏目名是不是贴近用户理解,而不是贴近团队内部叫法。
同一个页面拥有多个父级,在零售、SaaS、文档站里都很常见。运营角度看,它可以同时放进 New Arrivals、Laptops、Student Deals;用户角度看,这 3 个入口不是 3 个层级,而是 3 种归属。Google 文档允许多条 breadcrumb trail,但前提是路径真实、清楚、用户可见。页面若在模板层面支持多条路径,前台最好仍保留 1 条主路径,不然同一页今天从 A 进来像属于 A,明天从 B 进来又像属于 B。
可以先看一眼页面上最容易互相打架的 6 个位置:
页头主导航
面包屑文本
URL 路径
H1 标题里的栏目词
相关推荐模块
JSON-LD BreadcrumbList
只要其中 2 个位置不一致,用户返回上一级时就会犹豫;到 3 个位置不一致,路径感通常已经被打散。Google 也建议 URL 采用简单、可理解、合乎逻辑的结构,给用户和搜索引擎相同的层级提示。
再往下看,歧义常常来自“中间层太薄”。不少网站把层级拉到 5 级、6 级,看上去很完整,实际上中间页只有 3 到 4 个子页,甚至只是一个过渡目录。用户点回上一层后,看到的是内容很少、筛选很弱、上下文不够的集合页,停留时间通常会很短。层级不是越多越好,页面一旦超过 4 到 5 层,阅读路径会变长,标签差异又未必足够大,理解成本就会上去。
Baymard 在电商可用性研究里给出过很有参考性的比例:20% 的桌面站点在产品页没有 breadcrumbs,移动端没有产品页 breadcrumbs 的比例达到 65%;还有 36% 的电商站点没有提供完整类目路径。用户若从外部搜索结果、广告、邮件或社交平台落到深层产品页,没有完整路径时,很难判断页面属于哪个类目,也不容易回到同类列表继续浏览。
页面归属模糊时,最先受影响的通常不是首页流量,而是深层访问页。外部入口把用户送进 /blog/technical-seo/breadcrumb-guide,页头却突出 Resources,面包屑写成 Home > Learn > Search,相关推荐又全是 Case Studies,用户会花额外的 2 到 3 步去确认这页到底属于博客、学习中心还是案例库。每多一次判断,返回列表、继续浏览、点击相邻内容的意愿都会下降。
更稳妥的做法,是让每类页面只保留 1 条主归属路径,再允许它出现在多个入口里,但入口不等于父级。
产品页:1 个主类目,2 到 3 个辅助集合页
文章页:1 个主栏目,0 到 2 个专题聚合页
文档页:1 个文档树路径,其他模块只做推荐入口
帮助页:1 个帮助中心分类,相关问题模块不改父子关系
这样处理后,用户从任何入口进来,看到的主路径都保持一致;搜索引擎抓到的层级信号也更稳定。
栏目命名也要压缩到用户能一眼分开的范围。4 个并列栏目里,最好每个名字都能在 2 秒内说清差别。比如 Docs、Blog、Guides、Case Studies 的边界,通常比 Resources、Learn、Insights、Knowledge 更容易分开。后者的问题不在长度,而在语义重叠。用户做分类时,如果 8 个测试参与者里有 3 个以上把同一篇内容放进不同栏目,栏目名就需要再改。
可以按下面 3 组来排查,速度会比逐页看更快一些:
页面关系
单页是否有 1 个主父级
面包屑是否稳定在 2 到 4 级
上一级页面是否真能承接当前页
当前页是否被塞进多个一级栏目
命名关系
并列栏目名是否一眼能分开
同一词是否在导航、URL、H1 里反复变形
标签是否用了团队内部术语
两个栏目下的内容重合率是否超过 30%
模板关系
前台面包屑与 JSON-LD 是否 100% 一致
URL 是否跟主路径一致
相关推荐模块是否把页类型带偏
移动端是否删掉了完整路径
这里面,内容重合率是个很实用的细节。连续抽 50 篇文章,若有 15 篇以上可以“合理地”放进两个并列栏目,栏目边界通常已经偏模糊;若 50 个产品里有 20 个以上既像 Accessories 又像 Tools,栏目定义也需要重写。
移动端还要额外看一次。Google 从 2025 年 1 月起,在移动搜索结果里不再广泛显示 URL 面包屑路径,只保留域名展示;桌面端仍可能显示层级路径。用户在手机上从搜索结果进入页面后,外部结果页给到的位置提示变少,站内自己的路径就更要清楚。移动模板若把面包屑删掉,只留下返回箭头,用户看到的只剩“回上一页”,而不是“回上一级类目”。
做收缩时,可以优先删掉 3 类中间层:
子页少于 5 个的空目录页
名称和上一级只差一个近义词的目录页
90 天内几乎没有独立进入量的过渡页
删完后再把保留下来的层级统一到 4 个地方:
可见面包屑
URL
站内主入口链接
结构化数据
4 个位置保持同一套说法,用户读到的路径会更稳,Google 读到的层级也更连贯。结构化数据本身只是帮助搜索引擎理解页面内容,前台可见信息如果混乱,单靠标记很难长期弥补。
看一个更贴近执行的做法。抽 30 个深层页面,记录 6 项:主父级、URL、面包屑、H1、相关推荐归类、移动端显示。若其中有 9 页以上出现 2 项不一致,或有 5 页以上出现 3 项不一致,就不要再加新层级,而是先把旧路径收拢。
页面未被完全抓取或索引
你已经加了 BreadcrumbList,但 Google 先要拿到可抓取、可渲染、可索引的页面版本,才会考虑在搜索结果里用它。只要页面落在 “Discovered – currently not indexed”、“Crawled – currently not indexed”,或 Google 选了别的 canonical URL,面包屑就可能不显示;站点地图提交、通过富结果测试,都不等于会被索引或展示。
Google 把页面当成什么状态
先不要看 Breadcrumb JSON-LD,也不要先看富结果测试。你先在 Search Console 的 URL Inspection 里看 4 个字段:Indexing、Page fetch、Google-selected canonical、Last crawl time。Google 官方把这组信息单独列出来,不是为了排版好看,而是因为它们对应 4 个不同环节:发现 URL、抓取页面、确定规范版本、决定是否放进索引。只要有 1 个环节没通过,面包屑就可能不出现在搜索结果里。
很多站点在这里的第一个误判,是把“Google 知道这个 URL”当成“Google 已经能稳定展示这个 URL”。两者不是一回事。Google 在抓取与索引 FAQ 里写得很清楚:抓取和索引都需要时间,而且受多种因素影响,没有保证。 这也是为什么你在站点地图里提交了 500 个 URL,48 小时后可能只有一部分进入索引,另外一部分仍停留在 “Discovered – currently not indexed”。这个状态表示 Google 已发现 URL,但还没开始有效抓取。
接着看 “Crawled – currently not indexed”。这个状态更容易让人误会,因为页面已经被抓过,看起来像“差一步就上线”。Google 对大站抓取预算的说明给了更准确的框架:不是每个被抓取的页面都会被索引;抓取后还要经过评估、合并、适合性判断。
也就是说,Google 读过你的页面,不等于它愿意把这个版本放进主索引。对面包屑来说,后果很:Google 可能读到了你的 BreadcrumbList,但页面本身没进入可用索引,SERP 里仍不会采用它。
再往下看 “Google-selected canonical”。这里经常比索引状态更有信息量。Google 关于 canonical 的文档说得非常明确:搜索结果通常会指向 canonical page;即使你自己写了 rel="canonical",Google 也可能因为内容质量、重复程度、信号不一致,选择另一个 URL。于是你检查的是 https://example.com/blog/breadcrumbs-guide/,真正被 Google 采用的却是 https://example.com/resources/breadcrumbs-guide/,或者一个带尾斜杠、参数更少、路径更短的版本。
下面这张表,适合对照 Search Console 里的状态来读,不需要再靠感觉判断:
| URL Inspection / Indexing 状态 | Google 当前在做什么 | 你最该检查的字段 | 面包屑常见结果 |
|---|---|---|---|
| URL is on Google | 页面已进入索引 | Google-selected canonical、Rich results | 有展示机会,但不保证采用 |
| Discovered – currently not indexed | 已发现 URL,尚未有效抓取 | Sitemap、内部链接、服务器日志 | 基本不会显示 |
| Crawled – currently not indexed | 已抓取,未纳入索引 | 内容重复度、模板页占比、规范 URL | 常见为不显示 |
| Duplicate / Google chose different canonical | 你的 URL 不是被采用版本 | Canonical、重定向、站内链接一致性 | 可能显示别的路径 |
| Excluded by noindex | 页面被明确排除 | robots meta、HTTP header | 不会显示 |
| Blocked by robots.txt | Google 不能正常获取页面或资源 | robots.txt、资源加载 | 页面理解不完整,通常不显示 |
表格里最容易被忽略的是 Rich results。URL Inspection 确实会显示富结果分析,但它只是“页面包含哪些可识别标记”的一个层面。Google 公开文档把 index status 和 rich results analysis 分开列出,原因很简单:前者在回答“页面能不能进 Google 的搜索系统”,后者只是在回答“标记看起来能不能被解析”。你在工具里看到 Breadcrumb 有效,只能说明语法层面没有明显问题;它不能代替 “URL is on Google”。
然后看 “Last crawl time”。这个字段不是装饰信息。假设你 3 月 1 日修了 canonical,3 月 2 日改了服务器返回码,3 月 3 日把面包屑从 JS 注入改成了服务端输出,但 URL Inspection 里显示 Last crawl time 仍停留在 2 月 25 日,那么 Google 看到的还是旧版本。Google 在“请求重新抓取”文档里写得很明白:URL Inspection 可以申请重新抓取,但 有提交配额,而且多次提交同一 URL 不会让它抓得更快。
时间看完,再看 “Page fetch”。Google Search Console 文档里把它单列出来,是因为抓取成功与否不只看首页能不能打开,还看 Google 取到的是不是完整页面。这里常见的问题有 4 类:HTTP 不是 200、间歇性超时、重定向链过长、资源被阻挡。
Google 关于重定向的说明提到,301、302、meta refresh、JavaScript redirect 都会成为 canonical 信号的一部分;你以为用户和搜索引擎都到了同一页,Google 实际上可能把跳转目标当成主版本来评估。只要路径被改写,面包屑采用的也会跟着路径变。
再往前一步,站点结构也会改变你在 URL Inspection 里看到的结果。Google 在 crawling and indexing 文档里反复强调“发现内容”和“解析内容”都依赖站点如何向 Google 暴露页面。一个 5 万 URL 的目录站,如果只有站点地图提交,没有稳定的内部链接,Google 发现 URL 的速度和抓取优先级就会受影响;相反,一个只有 300 篇文章、每篇都能从栏目页和相关文章模块获得 3 到 8 个内部链接的站点,进入抓取队列通常更顺畅。
这里不用猜测算法细节,你只需要看 Search Console 里同一目录下 50 个 URL 的状态是否一致:如果 50 个里有 35 个都停在 “Discovered – currently not indexed”,问题大多不在面包屑代码,而在页面发现与抓取分配。
再补一层判断方式:不要只检查单个 URL,要抽样检查一组 URL。比较稳妥的做法,是从同一类型页面里抽 10 到 20 个,比如全是文章页,或全是产品页,记录 5 个字段:Indexing、Last crawl、User-declared canonical、Google-selected canonical、Page fetch。你会很快看出模式。若 12 个页面里有 9 个“Google-selected canonical”指向栏目页,说明 Google 并不把这批页面视为独立结果;若 15 个页面里有 11 个是 “Crawled – currently not indexed”,说明抓取已发生,但页面独特性或信号一致性不够。
还有一个常见误区,是把 sitemap 提交率当成索引率。Google FAQ 已经明确说明,提交站点地图不会保证所有 URL 被抓取或被索引。
站点地图更像“告知入口”,不是“收录命令”。如果一个站点地图含 2,000 个 URL,而 Page Indexing 里只有 620 个处于有效索引,剩下的大量 URL 仍可能处于 discovered、crawled-not-indexed、duplicate 或 excluded 状态。对 Breadcrumbs 来说,站点地图里的存在感几乎不能代替 URL Inspection 的 index verdict。你真正要看的,是 Google 现在把这页当成“可用索引页”、 “候选重复页”,还是“尚未进入索引流程的 URL”。
可以把排查顺序压缩成一列,方便照着走:
先看 Indexing verdict:是不是
URL is on Google。再看 Google-selected canonical:是不是你想让它排名的那个 URL。
再看 Last crawl time:Google 看的是否还是旧版本。
再看 Page fetch / robots / noindex:有没有访问或索引限制。
最后才看 Breadcrumb 标记和页面层级是否一致。
如果你是内容团队在配合开发,可以把判断门槛设得更明确一点:只有当某个 URL 同时满足 200 抓取成功、无 noindex、Google-selected canonical 为当前页、Indexing verdict 为 on Google、Last crawl 更新到改版之后,才值得继续检查面包屑展示问题。前面任意一项不满足,先修页面状态。这样排查会省很多时间,也能避免把“页面没被 Google 当成正式索引页”的问题,误判成“Breadcrumbs 代码没写好”。
Google 抓到的是哪一个版本
很多站点的问题不在“页面上有没有面包屑”,同一个 URL,浏览器里看到的是用户端完成渲染后的页面;Google 先拿到的却往往是原始 HTML,然后再决定要不要进入渲染流程。Google 的文档把抓取、渲染、索引拆成独立环节,原因很实际:HTML、渲染后 DOM、canonical、重定向、结构化数据,可能在不同阶段给出不同信号。
先看最常见的一类:页面首屏返回的是简化版 HTML,导航链和 Breadcrumb JSON-LD 由前端脚本在 1–3 秒后插入。用户刷新页面能看到完整路径,开发在浏览器 Elements 面板里也能看到,但 Google 不一定总能拿到同样结果。Google 关于 JavaScript 生成结构化数据的说明里写得很明确:可以用 JavaScript 生成结构化数据,但要注意渲染和实现方式。另一个文档又补了一句,渲染可能失败,尤其是依赖脚本重定向或后置注入时。
页面上“看得到”,不等于 Google 第一次抓取时就“拿得到”。
面包屑在浏览器里出现于第 2 秒,并不能证明 Google 在原始 HTML 阶段已经读到。
这就带出第二个问题:canonical 在渲染前后不一致。Google 近几个月更新过相关文档,写法比以前更明确:如果站点用客户端渲染,canonical 信息要尽量清楚;最好把 canonical 放在 HTML 源码里,而且不要让 JavaScript 再去改它。Google 还补充,如果没法在原始 HTML 写 canonical,那宁可只用 JavaScript 设置一次,也不要“前后两套”。
下面这张表最适合解释“你看到的版本”和“Google 采用的版本”为什么会分开:
| 场景 | 浏览器用户看到的页面 | Google 可能先拿到的页面 | 常见后果 |
|---|---|---|---|
| SSR 输出面包屑 | HTML 一开始就有层级 | 原始 HTML 就有层级 | 识别更稳定 |
| CSR 后注入面包屑 | 第 1–3 秒出现导航链 | 原始 HTML 里没有 | 面包屑可能不被采用 |
| HTML canonical=A,JS 改成 B | 用户看不出差别 | Google 前后读到 2 个 canonical | 规范版本混乱 |
| HTML 无重定向,JS 再跳到别的 URL | 用户最终到 B | Google 未必总看到 B | 采用 URL 不稳定 |
| 参数页和无参数页共存 | 用户常到带参数页 | Google 可能选无参数页 | SERP 显示别的路径 |
表里的第三行最值得注意。Google 在 canonical 文档里说过,Google 选择 canonical 时会综合多种信号;即使你显式指定了一个版本,Google 也可能因为内容质量或一致性问题选另一个。排查面包屑时,如果页面 URL、head 里的 canonical、渲染后 canonical 有 2 个以上不一致,Google 读到的站点层级很容易偏离你在前端里看到的层级。
然后要看重定向。很多站点把 URL 处理逻辑写在前端:打开 /product/blue-shoes 后,脚本再判断库存、语言或国家,随后跳去另一个地址。Google 对 JS 重定向的说明很直白:只有在不能用服务端或 meta refresh 的情况下才用 JavaScript 重定向;而且 Google 虽然会尝试渲染每个抓到的 URL,但渲染可能失败。也就是说,用户能稳定跳到目标页,不等于 Google 一定看到同样的跳转链。
如果服务端 200 返回了 A,
JavaScript 在第 800 毫秒把用户送到 B,
Google 有机会只处理 A,没有义务总是跟着脚本走到 B。
再往前一点,资源抓取也会改变 Google 读到的页面。很多人以为 robots.txt 只影响“页面能不能抓”,其实资源文件也算。假设你的面包屑 DOM 依赖 app.js,分类路径依赖 taxonomy.json,CSS 决定哪些导航节点显示,结果其中 1 个资源被 robots.txt 挡住,用户端通过缓存或别的请求路径还能显示正常,Google 却可能只拿到一半导航结构。
除了资源阻挡,还有“原始 HTML 过空”的问题。很多 JavaScript 站点初始 HTML 只有一个 div id="app",正文、分类、内链、面包屑都等脚本跑完才生成。Google 对 dynamic rendering 的文档已经说得很清楚:动态渲染只是临时替代方案,不是长期方案;更推荐 SSR、静态渲染或 hydration。这背后的原因很实际——原始 HTML 内容越少,Google 前期能用来判断页面主题、层级、重复关系的信息就越少。
可以把“版本偏差”的来源拆成一列,排查时更省时间:
原始 HTML 没有面包屑,渲染后才有
canonical 在 HTML 和渲染后不同
页面 200,但脚本再把用户送到别的 URL
参数 URL、尾斜杠 URL、大小写 URL 同时存在
资源被 robots.txt 或权限设置挡住
站内链接指向 A,canonical 指向 B,sitemap 提交 C
你会发现,这里面不少问题和面包屑代码本身没关系,而是页面“版本管理”没统一。Google 的 Breadcrumb 文档里说,Breadcrumb 表示页面在站点层级中的位置;前提是 Google 先确认“这页是哪一页、属于哪个规范版本、路径是不是稳定”。如果它看到的是参数页、重定向前的页、渲染失败的页,或者重复集中里被降为副本的页,最后在 SERP 里展示的路径就很可能不是你写在 JSON-LD 里的那条。
再举一个更贴近实操的例子。某个博客文章有 4 个可访问地址:
| 版本 | 是否返回 200 | 是否有 canonical | 页面是否含 BreadcrumbList |
|---|---|---|---|
/blog/breadcrumbs-guide | 是 | 指向自己 | 有 |
/blog/breadcrumbs-guide/ | 是 | 指向无斜杠版 | 有 |
/resources/breadcrumbs-guide | 是 | 指向自己 | 有 |
/blog/breadcrumbs-guide?ref=nav | 是 | 指向无参数版 | 无 |
对用户来说,4 个地址大多都能正常看文。对 Google 来说,这 4 个地址会形成一组重复页面,需要先选 1 个 canonical。Google 文档已经说明,canonicalization 是“从一组重复页里选代表页”的过程。既然是“先选代表页”,面包屑显示当然也会围绕代表页展开,不会围绕每个重复版本分别展示。
一组重复页里,用户点开任意 1 个都能读内容。
Google 在索引里只想记住 1 个版本。
你在别的副本页上写得再完整,也不保证会被拿来当 SERP 展示依据。
还有一个容易被忽略的点:Search Console 里看“URL is on Google”,也不表示 Google 用的是你刚改完的版本。Google 关于 recrawl 的文档写过,URL Inspection 可以请求重新抓取,但适合“少量 URL”;站点级更新更适合 sitemap。也就是说,你今天改了面包屑层级、明天又改了 canonical,再隔一天改了 JS 渲染逻辑,Google 可能还在按 3 天前抓到的版本评估页面。
只要 Last crawl time 没更新,Google 读到的内容仍可能不是你现在浏览器里看到的页面。排这类问题时,最实用的做法不是反复刷新富结果测试,而是把同一 URL 的 3 个版本并排比:
浏览器里用户看到的最终页面
View Source 里的原始 HTML
URL Inspection 显示的 canonical 与抓取时间
如果第 1 和第 2 已经不同,再去看第 3;如果第 2 和第 3 对不上,Google 采用的又会是另一套。面包屑显示问题往往就藏在这三层差异里。Google 文档没有把它叫成复杂概念,写法一直很务实:抓取、渲染、canonical、结构化数据,各自独立,但会互相影响。
把判断标准写得窄一点会更有用。只有当页面同时满足下面 5 条,才适合继续追 Breadcrumbs 展示问题:
原始 HTML 已含稳定 canonical
原始 HTML 或稳定渲染后可见面包屑
没有靠 JS 才能完成的重定向
参数页、斜杠页、栏目别名页没有同时竞争
Google 采用的 canonical 与你要推的 URL 相同
怎么把这类问题排出来
先按顺序排,不要一上来就看 Breadcrumbs 代码。你先在 Search Console 里抽 10–20 个同类型 URL,只看 5 个字段:Indexing verdict、Page fetch、Last crawl time、User-declared canonical、Google-selected canonical。Google 的 URL Inspection 数据结构本来就是按这几个字段拆开的,说明它们分别对应索引、抓取、时间和规范版本,不是一个总开关。
如果 15 个文章页里有 9 个显示
Crawled - currently not indexed,先不要查面包屑层级。
如果 12 个产品页里有 7 个Google-selected canonical不是当前 URL,先不要查 JSON-LD。
第一轮排查只做分类,不改页面。把 URL 按状态分成 4 组:URL is on Google、Discovered - currently not indexed、Crawled - currently not indexed、Duplicate / Google chose different canonical。Google 官方 FAQ 写得很清楚:站点地图、发布新页面、提交请求,都不保证何时抓取或何时索引,所以先把状态分布看清,比单页猜原因更有效。
可以按下面这张表登记,5 分钟就能看出模式:
| 抽样数量 | on Google | Discovered | Crawled not indexed | Google chose different canonical |
|---|---|---|---|---|
| 10 个文章页 | 4 | 2 | 3 | 1 |
| 10 个产品页 | 3 | 1 | 2 | 4 |
| 10 个分类页 | 7 | 0 | 1 | 2 |
如果某一类页面里 30% 以上都落在同一个异常状态,后面就按这一类状态查,不要把 4 类问题混在一起。这里看的是分布,不是单页例外。
接下来先看 Last crawl time。这个字段很容易被跳过,但它决定了 Google 看到的是旧版本还是新版本。假设你在 3 月 10 日改了 canonical,又在 3 月 11 日把面包屑从 JS 注入改成服务端输出,而 URL Inspection 显示最后抓取时间还是 3 月 4 日,那 Google 处理的还是旧页面。Google 关于重新抓取的说明里也写了,提交重新抓取请求只有少量 URL 适用,而且多次提交不会让抓取变快。
页面代码改了 2 次,但
Last crawl time没变,先别讨论“为什么还不显示”。
Google 没重新看到页面,Search 里的表现就不会跟着你的本地页面同步。
然后看 Page fetch。这里只分两种理解方式:抓到了完整页面,或者没抓到完整页面。问题通常不只是一句“页面能打开”。用户浏览器能开,不等于 Google 抓到的是同一个版本。你要检查的是:HTTP 返回码是不是 200,有没有先经过 301/302,有没有 meta refresh,资源是否被 robots.txt 挡住。
下面这列可以交给开发或运维核对:
HTML 返回码:200
非规范 URL 到规范 URL:1 次 301
不要长期保留多次跳转:例如
http -> www -> https -> slashrobots.txt 不要挡住面包屑依赖的 CSS/JS
页面不要在客户端再改 canonical
不要把同一内容挂在 2 个以上稳定可访问 URL 上
再往下看 canonical。这里不要只盯着 User-declared canonical,更要看 Google-selected canonical。Google 文档写得非常白:即使你声明了 canonical,Google 还是可能因为内容质量、重复程度、信号不一致,选另一个版本。排查时,至少要对照 3 组 URL:页面地址、声明的 canonical、Google 采用的 canonical。只要三者里有两者不同,Breadcrumbs 展示路径就可能跟你页面里的层级不一致。
| 你检查到的情况 | 处理顺序 |
|---|---|
| 页面 URL = 用户声明 canonical ≠ Google 采用 canonical | 先查重复内容、内部链接、跳转链 |
| 页面 URL ≠ 用户声明 canonical = Google 采用 canonical | 看是不是你自己把当前页设成了副本页 |
| 页面 URL = 用户声明 canonical = Google 采用 canonical | 再往下查抓取完整性和索引状态 |
如果出现“Google chose different canonical”,不要只改标签。先查站内链接。Google 关于重复 URL 的文档里提到,站内链接本身就是规范信号之一。一个页面如果在菜单里链接到 A,在正文里链接到 B,在 sitemap 里提交 C,Google 没理由只相信你 head 里的那一个 canonical。排查时,把同一模板里的链接统一到 1 个版本,效果通常比单改标签更稳定。
canonical 标签像“声明”;站内链接、跳转、sitemap、HTTPS 版本更像“持续重复出现的信号”。
当 4 类信号互相打架,Google 会自己选版本。
接着回头看 Discovered - currently not indexed。这一类页面,很多时候不是“质量差”,而是发现了 URL,但抓取还没排到,或者站内信号太弱。Google FAQ 里没有给固定天数承诺,也没有说提交 sitemap 后几小时一定处理。实操里要查 3 件事:这个 URL 是否在 sitemap 里、是否有至少 2–3 个内部链接指向它、是否和一大批参数页一起涌入。新页面数量如果一次增加 数百或数千,Google 抓取排队变慢很常见。
排这一类时,别先改正文,先看入口:
是否出现在 XML sitemap
sitemap 的 lastmod 是否更新
页面是否能从栏目页、相关文章、站内搜索结果被发现
是否存在
?sort=、?ref=、?color=一类参数页把抓取队列挤满新页面是否只存在于后台或孤立落地页,没有内链入口
再看 Crawled - currently not indexed。这一类比 discovered 更麻烦,因为 Google 已经读过页面,却没放进索引。这里排查不要停在“内容不够好”这种模糊说法,要看页面类型是否高度模板化。比如 20 个产品页,正文都只有 80–120 个词,规格表相同度超过 70%,唯一变化只是颜色或尺寸,Google 很容易把它们当成低差异页面。即使 BreadcrumbList 完整,页面本身也不一定进入主索引。
这里建议做一个很简单的核对表,不需要上复杂工具:
| 检查项 | 低风险状态 | 高风险状态 |
|---|---|---|
| 主体文字量 | 300 词以上且页面间差异明显 | 100 词左右,模板重复高 |
| 可索引 URL 数 | 每个主题 1 个主 URL | 同主题 3–5 个变体 URL 同时可索引 |
| 内链锚文本 | 稳定指向规范页 | 同主题锚文本乱指多版本 |
| 页面意图 | 单一、清楚 | 目录页、筛选页、标签页混在一起 |
走到这里,才轮到 Breadcrumbs 本身。排法也不要复杂化,只做 3 组对照:页面可见导航、HTML/渲染后源码里的 Breadcrumb 标记、Google 最终采用的 canonical URL。三者只要不一致,搜索结果里就可能不用你给的层级。Google 关于 Breadcrumb 结构化数据的文档说的是“帮助 Google 理解页面在站点层级中的位置”,不是“写了就必须展示”。
页面可见导航写的是
Home > Blog > SEO,
JSON-LD 写的是Home > Resources > Technical SEO,
Google 采用的 canonical 却是/guides/seo/...。
这种组合,SERP 里路径不稳定很常见。
把排查结果写成一页表,不要只停留在口头判断。每个 URL 记录 8 项已经够用:页面类型、状态、最后抓取时间、声明 canonical、Google canonical、返回码、内链数量、面包屑是否一致。你抽 20 个 URL,半小时内通常就能看出问题集中在哪一列。只要能看出列上的集中分布,处理顺序就会很清楚:先修索引状态,再修 canonical,再修抓取完整性,最后才看 Breadcrumbs 标记。






