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 更明确。