Search Console → Crawl Stats 显示 Googlebot 每天访问首页几十次,但 /articles/* 加起来都没几次。新文章发布几周都不被抓。Sitemap 早就提交了,也不见效。
最快的一步判断(60 秒): 跑一下 curl -sL https://yourdomain.com/ | grep -c "/articles/"。如果这个数接近 0,说明 Google 从首页 HTML 里根本看不到你的文章链接(属于发现失败)——先修这个。如果数量正常、但页面还是卡在 “Discovered — currently not indexed”,那是抓取预算 / 质量失败,修法完全不同。下面 Step 1 会把这个判断做精确。
症状
- Crawl Stats 显示首页每日被命中,但
/articles/*很少被命中 - 新文章 2-4 周才被发现(远超正常的 3-7 天)
- Sitemap 已提交,但 Google 很少抓里面的 URL
- URL Inspection 把文章 URL 报成 “Discovered — currently not indexed” 或 “URL is unknown to Google”
你属于哪一类?
这两种根因要用相反的修法。动手前先用下表确认自己属于哪一类。
| 信号 | 发现失败 | 抓取预算 / 质量失败 |
|---|---|---|
curl 首页后数 /articles/ 链接 | 0 或少于 5 | 数量正常 |
| URL Inspection 状态 | ”URL is unknown to Google" | "Discovered — currently not indexed” |
URL 是否在 sitemap 里、且能通过 <a href> 到达? | 否 | 是 |
| Google 实际在说什么 | ”我从没发现过这个 URL" | "我发现了,但暂时不想花预算” |
| 去看 | Step 2-3 | Step 4-8 |
“Discovered — currently not indexed” 的确切含义是:Google 知道这个 URL(来自你的 sitemap 或某个链接),但还没去抓——这几乎总是抓取预算、排队或感知质量的决策,而不是技术性封锁。(Google 的抓取预算文档指出,抓取预算只有在站点超过 100 万页、或超过 1 万页且内容每天大改时才会成为真正的瓶颈——所以小站上这通常是质量 / 内链信号,而非真的撞到预算上限。)
常见原因
1. 首页用 JS 渲染文章链接,Google 看不到
最常见。首页”最新文章”列表是 React/Vue/Svelte 在 hydration 之后挂上去的,所以 Googlebot 首次抓到的原始 HTML 里没有任何指向文章的 <a href>。
如何判断:
# 不执行 JS 看首页(这大致就是 Googlebot 首次抓到的内容)
curl -sL https://yourdomain.com/ > home.html
# 数原始 HTML 里的文章链接
grep -oE 'href="/articles/[^"]+"' home.html | wc -l
# 0 或很少 = 链接靠 JS 渲染,不在 HTML 里
Google 确实会渲染 JS,但渲染是单独排队的,可能比首次 HTML 抓取晚几天到几周。出现在首个 HTML 响应里的链接会被立即发现;只在 hydration 之后才出现的链接不会。
2. 首页只展示最新 5-10 篇,老文章要点 3 次以上才能到
首页(5 篇最新)→ /blog(分页 page 1)→ /blog/page/2 → 文章
距首页 3 次以上点击 = Google 把它当低优先级,很少去抓。
3. Sitemap 里没有文章 URL,或 sitemap 超出上限
# 数 sitemap 里的 URL
curl -s https://yourdomain.com/sitemap.xml | grep -c "<loc>"
# 应大致等于你站的实际文章数
手动维护的 sitemap 经常漏掉新文章。按 sitemaps.org 协议,单个 sitemap 文件最多含 50,000 个 URL,且未压缩不得超过 50MB;任一上限被突破,Google 会拒收该文件,你必须拆成 sitemap index。
4. 文章页太薄,Google 把整个路径降优先级
如果 Googlebot 头几次抓 /articles/* 抓到的都是不足约 300 字、或模板化的页面,它会学到”这类 URL 不值得回访”,然后把整个目录的优先级降下来,而不只是那一篇薄文。
5. 内链锚文本太通用(“read more”)
<a href="/articles/foo/">read more</a>
<a href="/articles/bar/">查看全文</a>
通用锚文本是弱发现信号。Google 看到有链接,却完全不知道它指向什么主题,于是目标页几乎得不到排名或抓取优先级上的加成。
6. 文章页 URL 被 robots.txt 屏蔽
Disallow: /articles/draft/
写得太宽的规则(比如 Disallow: /a)会悄悄屏蔽掉 /articles/。用 URL Inspection → “Page indexing” 确认——如果中招,它会显示 “Blocked by robots.txt”。注意:在这里用 noindex 比没用还糟——Google 仍会花一次抓取把页面取回来才看到标签,所以 robots.txt 只用于你真的永远不想被抓的页面。
7. 服务器对 Googlebot 慢 / 返回 5xx
当你的服务器响应又快又稳时,Google 的抓取容量上限会上升;变慢或报错时则下降。频繁超时或 5xx 会让 Google 主动给整站降速。
如何判断: Crawl Stats → “Crawl responses” → 看平均响应时间以及 5xx / 超时响应的占比。响应时间上升、或错误占比不低,就是该动手的信号(Google 没有公布硬性的毫秒阈值)。
最短修复路径
Step 1:先分清是发现失败还是抓取预算失败
# 关 JS 看首页源码,数文章链接
curl -sL https://yourdomain.com/ | grep -c "/articles/"
- 0 或少于 5 → 发现失败 → Step 2-3
- 数量正常 → 抓取预算 / 质量失败 → Step 4-8
再在 URL Inspection 里交叉验证某一篇具体文章:“URL is unknown to Google” 确认为发现失败;“Discovered — currently not indexed” 确认为预算 / 质量这一类。
Step 2:把列表组件改成服务端渲染(SSR / SSG)
如果用 Next.js:
// 错:客户端 useEffect 后 fetch(链接不在首个 HTML 里)
function LatestPosts() {
const [posts, setPosts] = useState([]);
useEffect(() => { fetch('/api/posts').then(r => r.json()).then(setPosts); }, []);
return posts.map(p => <a href={p.url}>{p.title}</a>);
}
// 对:getStaticProps(链接直接写进 HTML)
export async function getStaticProps() {
const posts = await getAllPosts();
return { props: { posts } };
}
Astro 默认就是 SSG,它的 <a href> 链接本来就在 HTML 里。纯 React 的 SPA 可以用 react-snap、Prerender.io 预渲染,或迁到一个会直接输出 HTML 的框架。部署后再跑一遍 curl ... | grep -c,那个数应该会跳上去。
Step 3:加一个分页的 /articles 总索引,并从导航链接它
---
// src/pages/articles/index.astro
import { getCollection } from 'astro:content';
const posts = await getCollection('posts');
const sorted = posts.sort((a, b) => b.data.publishedAt - a.data.publishedAt);
---
<h1>全部文章 ({sorted.length})</h1>
<ul>
{sorted.map(p => (
<li>
<a href={`/articles/${p.slug}/`}>{p.data.title}</a>
<span>{p.data.publishedAt.toLocaleDateString()}</span>
</li>
))}
</ul>
首页和主导航都链到 /articles/,这样任何文章从站内任何位置都最多两次点击可达。
Step 4:修正 sitemap
每篇文章 URL 都要有真实的 lastmod:
<url>
<loc>https://yourdomain.com/articles/foo/</loc>
<lastmod>2026-05-21</lastmod>
</url>
lastmod 必须是真实修改时间。给每个 URL 都盖上今天的日期不会加速任何事——Google 会把不可靠的 lastmod 当噪音,进而对你整站忽略这个字段。
超过 50,000 个 URL 或 50MB,就拆成 sitemap index:
<!-- sitemap-index.xml -->
<sitemapindex>
<sitemap><loc>https://yourdomain.com/sitemap-articles.xml</loc></sitemap>
<sitemap><loc>https://yourdomain.com/sitemap-pages.xml</loc></sitemap>
</sitemapindex>
Step 5:用 URL Inspection 强制抓取 5-10 篇优先文章
这是确认页面本身没被屏蔽最快的办法,同时在你的结构性改动生效之前先把收录启动起来。
- Search Console → URL Inspection → 粘贴文章 URL。
- 点 “Test Live URL”——确认 “URL is available to Google”,并且渲染后的 HTML 里有你的正文(不是空壳)。
- 点 “Request Indexing”。
截至 2026 年 6 月,这个按钮被限速到每个资源每天约 10-12 个 URL,超额后会灰掉 24 小时——所以把它花在价值最高的页面上。需要批量提交,就用 URL Inspection API,配额高得多。(针对 Google 别折腾 IndexNow:截至 2026 年,Google 仍不消费 IndexNow,只有 Bing/Yandex 用。)
Step 6:审最近 10 篇文章的质量基线
每篇应当具备:
- 仅一个真正的
<h1> - 一段导语(80 字以上)
- 正文 600 字以上
- 至少 2 处来自其他文章、指向本篇的内链
- 至少 1 张带 alt 文本的图片
低于这条线的页面先改好再发,否则会拖累整个 /articles/* 的优先级。
Step 7:修内链锚文本
<!-- 差 -->
<a href="/articles/foo/">read more</a>
<!-- 好 -->
<a href="/articles/foo/">Astro 部署到 Vercel:完整指南</a>
带主题词的锚文本是很强的发现与排名信号。每篇新文章发布后一天内,从已收录的高流量页面给它加 2-3 处上下文相关的内链——这是让 “Discovered” 页面真正被抓取的最大杠杆。
Step 8:修服务器对 Googlebot 的响应时间
# 用 Googlebot 的 user-agent 给一个页面请求计时
curl -sL -A "Mozilla/5.0 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)" \
-w "%{time_total}\n" -o /dev/null https://yourdomain.com/articles/foo/
# 目标是远低于 1.5s
慢 → 加 CDN、静态化缓存、压缩服务端渲染时间。更快更稳的响应会抬高 Google 给整站的抓取容量上限。
如何确认修好了
- 再跑
curl -sL https://yourdomain.com/ | grep -c "/articles/"——链接数现在应能反映你真实的文章数。 - 在 URL Inspection 里,原本卡住的文章应从 “Discovered — currently not indexed” 转到 “Crawled”,再到 “Indexed”(排队需要几天到几周)。
- Crawl Stats → “By response → OK (200)” 在随后 1-2 周里应显示
/articles/*命中数上升。确认恢复看的是目录级的趋势,而不是某一天。
哪些情况可能不是你操作错了
大站上 Google 会刻意给每个目录的抓取率限速。这不是站坏了,而是 Google 判定你的站赚到了多少预算。这里的杠杆是权威度:积累外链、提升整站质量,让 Google 随时间分配更多抓取预算。
容易误判的情况
- 在 sitemap 里设
<priority>有用——Google 几乎完全忽略它。 - 反复重交 sitemap 有用——Google 早有你的 sitemap,重交并不会重新排抓取优先级。
- 往首页堆关键词有用——堆词反而触发 spam 信号。
- Ping sitemap 能加速——Google 已在 2023 年彻底废弃 sitemap ping 接口,旧的
/ping?sitemap=现在返回 404。
预防建议
- 重要页面绝不只靠 JS 渲染链接,永远在 HTML 里输出 SSR / SSG 的
<a href>。 - 让每篇文章从站内任何位置都最多两次点击可达(首页 →
/articles索引 → 文章)。 - 内链按主题组织成 cluster,用 hub 页集中链接。
- 每条内链锚文本都用主题词,绝不用 “more” / “read”。
- 盯着 Crawl Stats → 响应时间和错误率,任一上升就动手。
FAQ
Q:现在 Ping sitemap 还有用吗?
A:没用。Google 在 2023 年废弃了 sitemap ping 接口,旧 endpoint 现在返回 404。最强的发现信号是这个 URL 能否从你自己站内权威页通过 <a href> 直接到达。
Q:我的文章显示 “Discovered — currently not indexed”,最有效的单点修法是什么? A:从已收录的高流量页面给它加 2-3 处上下文内链,然后用 URL Inspection → “Request Indexing”。这一组合同时处理了优先级信号和抓取排队。
Q:每天能强制抓取多少个 URL? A:截至 2026 年 6 月,URL Inspection → “Request Indexing” 每个资源每天约 10-12 个 URL,超额后灰掉 24 小时。要更大量,用 URL Inspection API。
Q:把 XML sitemap 换成 JSON 有用吗? A:没用——sitemap 格式不是瓶颈,发现(内链)和质量才是。
Q:用 Cloudflare 缓存能改善 Googlebot 响应时间吗? A:能。文章页可静态缓存时,命中缓存能把响应时间从几百毫秒降到几十毫秒,从而抬高 Google 给整站的抓取容量上限。