孤儿页:没有内链,所以收录不了

URL 在 sitemap 里,但站内没有任何页面链向它。Google 视它为不重要,把它压在 'Discovered — currently not indexed'。修法:从已收录页面补 2 条以上正文内链。

URL 出现在 sitemap.xml 里,但站内没有任何页面链向它——这就是”孤儿页”。Google 通过 sitemap 知道它存在,但孤儿页拿不到任何内链给的”重要性投票”,于是被压在抓取队列最底部,通常会在 Discovered - currently not indexed 卡上几周甚至几个月。

最快的修法: 从已经被收录、且话题相关的页面,给这个孤儿页补至少 2 条正文内链,然后在 Search Console 里 Request indexing 一次。下面所有内容背后只有一个心智模型:sitemap 是发现信号,内链才是重要性信号。 这两者不能互相替代。

症状

  • URL 在 sitemap.xml 里,但一直卡在 Discovered - currently not indexed
  • 内链审计显示这个页 0 条入站内链
  • 这个页可能有外部反链也可能没有——不管有没有,收录都很慢
  • 在 Google 搜 site:yourdomain.com/the-url 什么都搜不到

你属于哪一种”未收录”?

Search Console 里这两种状态看着像,但修法完全相反。先用 URL Inspection 查清楚:

状态含义根因修法方向
Discovered - currently not indexedGoogle 发现了这个 URL,但还没抓取抓取优先级太低——通常是内链弱或没有补内链、降低点击深度(本文)
Crawled - currently not indexedGoogle 抓过了,但选择不收录内容薄 / 重复 / 质量低改页面内容本身

孤儿页几乎都落在第一行。如果你看到的是 Crawled - currently not indexed,光补内链没用——问题出在页面内容上。

常见原因

1. 页面建好后,没被任何列表、分类或相关文章组件链过

新写的文章没被加进首页”最新”区,没出现在任何分类列表,也不在其他文章的”相关阅读”模块里。

如何确认(在仓库根目录运行):

rg -l 'href="/your-orphan-url/?"' src/ | wc -l
# 0 = 孤儿

2. 只有直接输入 URL 才能到达

从首页出发,能不能在 3 次点击以内到达这个页?不能的话,就当它是孤儿。截至 2026 年 6 月,距首页 3 次点击以内的页面会得到优先抓取、更快收录;更深的页面只能去抢剩下的抓取预算。

3. 只被很旧、低权重的 URL 链接

内链是有,但链它的那些来源页本身就是 0 流量、低权重的孤儿,传过去的权重几乎为 0。

如何确认: 用 Screaming Frog 或 Ahrefs 看那些来源页的点击深度和页面权重。

4. 只通过 nofollow 或 JS 渲染的组件被链

内链存在,但全是 rel="nofollow",或者只有客户端 React useEffect 跑完后才渲染出来。nofollow 链接 Google 可能不计入抓取发现,JS 注入的链接也比原始 HTML 里的链接抓取得更不可靠。把真正的 <a href> 标签放进服务端渲染的 HTML 里。

5. URL 路径改了,但旧内链没更新

页面最早叫 /blog/old-slug,后来挪到了 /articles/new-slug。301 redirect 设好了,但所有内链还指向旧 URL,新 URL 从没收到一条直链,于是一直是孤儿。链向被重定向 URL 的链接,是一个更弱、更间接的信号,远不如直接链向最终 URL。

6. 分页 / Tag / 归档结构把深层文章孤立掉

/blog/page/15 里的文章只能靠翻归档才能到。几周后新文章把它顶到爬虫懒得去翻的位置,它就成了事实上的孤儿。

最短修复路径

Step 1:找出每一个孤儿页

可靠的做法:爬整站抓出所有内链,再和 sitemap 对比。差集(在 sitemap 里、但爬不到的)就是你的孤儿清单。

# 用 wget 镜像爬整站
wget --spider --recursive --no-verbose --no-directories \
  --output-file=crawl.log https://yourdomain.com/

# 提取爬到的所有 URL
grep "http" crawl.log | awk '{print $3}' | sort -u > crawled.txt

# 提取 sitemap 里的 URL
curl -s https://yourdomain.com/sitemap.xml \
  | grep -oE '<loc>[^<]+</loc>' | sed 's/<\/\?loc>//g' > sitemap.txt

# 差集 = 只在 sitemap 里出现的 URL = 孤儿
sort sitemap.txt crawled.txt crawled.txt | uniq -u > orphans.txt

更全面的工具:Screaming Frog(免费版可爬 500 URL,它的 Sitemaps -> Orphan URLs 报告会直接拿爬取结果对比 sitemap)或 Sitebulb(报告更直观)。在 Search Console 里,Pages(Indexing)报告中 Discovered - currently not indexed 下列出的 URL,本身就是一份很好的孤儿候选名单。

Step 2:逐条判断这个孤儿该不该存在

打开 orphans.txt,逐条分流:

  • 该存在的(真有价值的页面):补内链(见 Step 3)
  • 不该存在的(测试页、重复、过期):从 sitemap 里删掉,并返回 410 Gone 或加 noindex。别把死 URL 留在 sitemap 里,那是在白白浪费抓取预算。

Step 3:从相关的、已收录的页面补 2 条以上正文内链

对每个值得保留的孤儿页:

# 找出话题最相关的 3-5 篇老文
rg -l "相关关键词" src/ | head -5

在这几篇里,各加一条写在句子里的正文内链(放在正文里,不要塞进通用页脚),锚文本里包含目标 query。目标是至少 2 个不同的来源页,最好 3-5 个,并且优先选那些本身已被收录、有流量的来源页。来自相关、已收录页面的正文内链,传递的价值远高于页脚或侧边栏链接。

Step 4:把孤儿页变成一个自动、结构性的问题

一次性补链会反弹,要从源头堵住缺口。对 Astro 内容站,在每篇文章末尾自动渲染一个相关阅读块:

---
import { getCollection } from 'astro:content';
const allPosts = await getCollection('posts');
const related = allPosts
  .filter(p => p.data.tags?.some(t => Astro.props.tags.includes(t)))
  .filter(p => p.slug !== Astro.props.slug)
  .slice(0, 5);
---
<aside>
  <h2>相关阅读</h2>
  <ul>
    {related.map(p => <li><a href={`/articles/${p.slug}/`}>{p.data.title}</a></li>)}
  </ul>
</aside>

同时确保有一个枢纽页(首页、/articles/ 索引页,或各分类索引页)链向每一篇文章,而不是只列最新 5 篇。一个完整、可抓取的索引页,是防孤儿最有效的单项措施。

Step 5:重交 sitemap,触发重新发现

老的 https://www.google.com/ping?sitemap=... 接口已在 2023 年 6 月废弃,现在返回 404——别再用了。改在 Search Console 里重交:

  1. Search Console -> Sitemaps -> 先删掉 sitemap,再重新添加并提交一次。
  2. 确认 sitemap 里这些更新过的 URL 带有准确的 <lastmod> 日期。自从 ping 接口下线后,Google 更依赖 <lastmod> 来判断该重抓什么,所以它必须反映真实的最后修改时间(不要每次构建都写成”现在”)。
  3. 挑 1-2 个修过的孤儿页,用 URL Inspection -> Request indexing 推一下。

如果你还想让 Bing、Yandex 等支持 IndexNow 的引擎立刻收到变更,可以 ping IndexNow。注意:截至 2026 年 6 月,Google 不支持 IndexNow,它仍然依赖 sitemap、内链和 Search Console——所以 IndexNow 帮的是 Bing,不是 Google 收录。

Step 6:等 2-4 周,盯对的信号

  • 约 2 周: Search Console 的 Crawl Stats(Settings -> Crawl stats)里,这些 URL 开始出现新的抓取记录。
  • 约 4 周: URL Inspection 状态从 Discovered - currently not indexed 翻成 URL is on Google

如果 4 周后某个 URL 还卡在 Discovered,说明内链信号还是太弱——从更权威、更高流量的页面再补链,并降低它距首页的点击深度。

如何确认已修好

  1. 重跑 Step 1 的孤儿差集:这个 URL 不再出现在 orphans.txt 里。
  2. URL Inspection 在 “Discovery” 下显示至少有一个 referring page,状态是 URL is on Google
  3. 在 Google 搜 site:yourdomain.com/the-url,终于能搜到这个页。

提醒:有几个孤儿是正常的

大站点在改版或调整分类时,总会冒出几个孤儿页。这很正常——放到下一次月度审计里收掉就行,别把每一个都当成紧急事故。

容易误判的情况

  • 反复把孤儿页塞进 sitemap: Google 早就知道它存在,sitemap 从来不是缺的那一环。
  • 把 “Request indexing” 当解药: 它有配额(截至 2026 年 6 月,每个 property 大约每天 10-12 个 URL,超了按钮会灰掉 24 小时),而且修不了底层的内链信号。
  • 以为加 1 条内链就够: 单条内链很难把孤儿顶出队列;用 2 条以上、来自不同已收录页面的链接。
  • 以为 tag 页能解决: 只有当 tag 页本身被收录、内链完整、不薄时才有用。
  • 混淆这两种状态: Crawled - currently not indexed 是内容质量问题,不是链接问题(见上面的表)。

预防建议

  • 发文前,先从至少 2 篇相关老文补内链,并把这个页加进首页或某个分类索引页。
  • “相关文章”组件要触达更深的存档,不只是最新 5 篇。
  • 每月做一次轻量孤儿审计(用 Screaming Frog,或上面那段 wget 差集)——10 分钟的活儿。
  • 改 URL 结构时,同步更新每一条内链,不要只靠 301。
  • sitemap 里的 lastmod 要写真实值,让重抓按真实变更来调度。

FAQ

Q:孤儿页到底需要多少条内链? A:至少 2 条来自不同、且已被收录页面的正文内链,最好 3-5 条。来源页的质量(已收录、相关、有流量)比纯数量更重要。

Q:tag 页或分类页能解决孤儿文章吗? A:只有当这些 tag / 分类页本身可索引、内链完整、不薄时才行。一个又薄又 noindex 的 tag 页几乎传不出任何权重。

Q:在 sitemap 里加 <priority> 有帮助吗? A:没有。Google 忽略 <priority><changefreq>。只有 <loc><lastmod> 有用,而 lastmod 也只有在准确时才算数。

Q:用 404 删掉孤儿页,会伤站点权威吗? A:删掉真正薄的页面是正向的——少了一个拖累抓取预算的低价值 URL。如果你确定一个页面要永久下线,用 410 Gone404 更好,它是更明确的”别再来”信号。

Q:我已经 Request indexing 了,为什么还是没收录? A:“Request indexing” 只是把抓取重新排队,它压不过重要性信号。如果内链还是弱,Google 重抓后还会把它重新压回去。先修内链,再 Request indexing。

相关阅读

标签: #SEO #Google #Search Console #收录 #排查 #孤儿页