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

URL 在 sitemap 里,但站内没有任何页面链向它——Google 视它为不重要,要么延迟抓取,要么直接跳过。

URL 在 sitemap.xml 里,但站内没有任何页面链向它——这叫”孤儿页”。Google 通过 sitemap 知道它存在,但孤儿页没有任何内链的”重要性投票”,Google 会把它扔到抓取队列底部,常常 “Discovered — currently not indexed” 卡几个月不动。

修法的核心理解:sitemap 是发现信号,内链才是重要性信号。这两个不能互相替代。

症状

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

快速结论

Sitemap 收录只是发现提示,不是重要性投票。Google 用内链结构判断先爬什么、是否收录。

常见原因

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

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

如何判断

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

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

从首页出发能不能在 3 次点击内到达这个页?如果不能,那是孤儿。

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

虽然有内链,但链它的页面本身也是 0 流量、低权重的孤儿——内链权重几乎为 0。

如何判断:用 ahrefs / Screaming Frog 看每个内链来源的”页面权重”。

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

内链存在,但全是 rel="nofollow",或全是 React useEffect 后才渲染的——Google 看不到这些链接。

5. 历史 URL 改了路径但旧链接没更新

最早叫 /blog/old-slug,后来改成 /articles/new-slug。301 redirect 设了,但内链全是旧 URL → 新 URL 是孤儿。

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

/blog/page/15 里的文章只有从分页流走才能到,3-4 周后就被新文章顶下去——变孤儿。

最短修复路径

Step 1:找出所有孤儿页

最快的方式:爬整站抓所有内链 → 对比 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 里有但站内没爬到的 = 孤儿
sort sitemap.txt crawled.txt crawled.txt | uniq -u > orphans.txt

或更专业:Screaming Frog 免费版 500 URL,Sitebulb 报告更直观。

Step 2:逐页判断是否该存在

打开 orphans.txt 逐条看:

  • 该存在的(真有价值的文章):补内链
  • 不该存在的(测试页、重复、过期):从 sitemap 删 + 加 noindex 或返回 404

Step 3:从相关高流量文章加 2+ 内链

对每个该存在的孤儿页:

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

# 在每篇文章末尾加"相关阅读"链接,锚文本含目标 query

最少 2 处内链来源,最好 3-5 处。

Step 4:把孤儿页加进自动模块

修一次只是治标。要从根源避免:

<!-- 文章末尾自动列 5 篇相关 -->
---
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/ 索引页列出所有文章,不是只 latest 5。

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

修完后:

# 重交 sitemap
curl "https://www.google.com/ping?sitemap=https://yourdomain.com/sitemap.xml"
# (注:此 ping 接口 Google 已废弃,到 Search Console 手动重交)

到 Search Console → Sitemaps → 删除再重提交。然后挑 1-2 个修过的孤儿页用 URL Inspection → Request indexing 触发抢救。

Step 6:等 2-4 周观察

修完后:

  • 2 周:Crawl Stats 里这些 URL 开始出现新抓取记录
  • 4 周:URL Inspection 状态从 “Discovered” 变 “URL is on Google”

如果 4 周后仍然 Discovered,说明内链信号不够强,需要从更权威的页面加。

哪些情况可能不是你操作错了

大站点改版或调整分类时总会出现一些孤儿页,下一次迭代修就行。

容易误判的情况

  • 反复把孤儿页塞 sitemap 没用:Google 早知道它存在,只是不重视
  • Request Indexing 当万能药:每天有配额,不能解决根本的内链信号问题
  • 以为加 1 处内链就够:孤儿页至少要 3 处来自不同页面的内链才有效
  • 以为 tag 页能解决孤儿:只有当 tag 页本身被收录且权威时才有用

预防建议

  • 发新文前先从至少 2 篇相关老文加内链 + 加进首页 / 索引页
  • “相关文章”组件要触达更深的存档,不只是最新 5 条
  • 每季度做一次孤儿页审计(用 Screaming Frog / wget mirror)
  • URL 结构改动时同步更新所有内链,不要只设 301
  • sitemap 永远自动生成;新建文章自动入

FAQ

Q:标签页能解决孤儿问题吗? A:只有当标签页本身可索引、链接完整、不薄时才有用。

Q:Sitemap 里加 <priority> 有帮助吗? A:没用,Google 多数情况下忽略 priority 提示。

Q:404 删除孤儿页对站点权威有影响吗? A:删薄页对站点权威是正向的(少了拖累项)。但用 410 比 404 更明确。

相关阅读

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