Search Console → 抓取统计信息显示 Googlebot 每天访问你首页几十次,但 /articles/* 路径加起来都没几次。新文章发布后几周内根本不被抓取。Sitemap 早提交了也没用。
两种本质原因:Google 从首页找不到文章 URL(发现失败),或者它故意不在文章页上花预算(分配失败)。修法不一样。
症状
- Crawl Stats 显示首页每日命中,但文章页很少被命中
- 新文章 2-4 周才被发现(远超正常的 3-7 天)
- Sitemap 已提交但 Google 很少抓里面的 URL
- 文章页 URL Inspection 大多是 “Discovered” 或 “URL unknown to Google”
快速结论
要么 Google 从首页找不到文章 URL,要么它故意不在这些 URL 上花预算。两种都能修,但对应的修法不同。先用 Step 1 判断是哪种。
常见原因
1. 首页用 JS 渲染文章链接,Google 看不到
最常见。首页”最新文章”列表是 React/Vue/Svelte 在 hydration 后挂上去的。
如何判断:
# 不执行 JS 看首页
curl -sL https://yourdomain.com/ > home.html
# 数文章链接
grep -oE 'href="/articles/[^"]+"' home.html | wc -l
# 0 或很少 = 链接靠 JS 渲染
2. 首页只展示最新 5-10 篇,老文章 3+ 次点击才到
首页(5 篇最新)→ /blog(分页 page 1)→ /blog/page/2 → 文章
老文章 3+ 次点击 = Google 把它当低优先级。
3. Sitemap 里没有文章 URL,或 sitemap 太大没法解析
# 看 sitemap 里有多少文章
curl -s https://yourdomain.com/sitemap.xml | grep -c "<loc>"
# 应该和你站文章数一致
如果 sitemap 是手动维护的,新文章可能根本没进。或者 sitemap 文件 > 50MB / > 50000 URL,Google 解析不动。
4. 文章页内容太薄,Google 来过一次就降优先级
如果 Googlebot 第一次抓到的文章都是 < 300 字 / 模板化内容,它会标”这类页面不值得回访”,整个 /articles/* 路径降优先级。
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/。
7. 服务器对 Googlebot 慢 / 5xx
如果 server 对 Googlebot 响应慢(> 3 秒)或经常 5xx,Google 会主动降低抓取速率。
如何判断:Crawl Stats → 抓取响应 → “平均响应时间”。> 1000ms 是问题。
最短修复路径
Step 1:先判断是发现失败还是分配失败
# 关 JS 看首页源码
curl -sL https://yourdomain.com/ | grep -c "/articles/"
- 0 或 < 5:发现失败,走 Step 2-3
- 正常数量:分配失败,走 Step 4-6
Step 2:把列表组件换成 SSR / SSG
如果用 Next.js:
// 错:useEffect 后 fetch
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
export async function getStaticProps() {
const posts = await getAllPosts();
return { props: { posts } };
}
Astro 默认是 SSG。React-only 站可以加 pre-render(用 react-snap 等)。
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/。这样任何文章 ≤ 2 次点击可达。
Step 4:Sitemap 修正
确保每篇文章 URL 都有真实 lastmod:
<url>
<loc>https://yourdomain.com/articles/foo/</loc>
<lastmod>2026-05-21</lastmod>
</url>
lastmod 必须是真实修改时间,不要全填今天(Google 会忽略)。
如果 sitemap > 5000 URL,拆成 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:审最近 10 篇新文章的质量基线
每篇必须:
- 真
<h1>一个 - 导语段(80 字以上)
- 正文 600+ 字
- 至少 2 处来自其他文章的内链
- 至少 1 张图 + alt 描述
低于这条线的文章先补再发,否则只会拖累 /articles/* 全路径的抓取优先级。
Step 6:把内链锚文本改成包含话题关键词
<!-- 差 -->
<a href="/articles/foo/">read more</a>
<!-- 好 -->
<a href="/articles/foo/">Astro 部署 Vercel 完整指南</a>
锚文本里有话题词 → Google 把它当强发现信号。
Step 7:修服务器对 Googlebot 的响应
# 模拟 Googlebot 测速度
curl -sL -A "Mozilla/5.0 (compatible; Googlebot/2.1)" \
-w "%{time_total}\n" -o /dev/null https://yourdomain.com/articles/foo/
# 应该 < 1.5s
慢 → 加 CDN、加缓存、优化 server-rendered 时间。
哪些情况可能不是你操作错了
大站点 Google 主动限速每个目录的抓取率。这不是站点坏了,而是 Google 决定了能花多少预算。修复 = 推外链 + 提升整体权威,让 Google 愿意分更多预算。
容易误判的情况
- Sitemap 里设
<priority>没用:Google 几乎完全忽略 - 反复重交 sitemap 没用:Google 早知道 sitemap 内容,问题不在发现
- 往首页堆关键词没用:堆词反而触发 spam 信号
- 以为 Ping sitemap 能加速:Google 2023 起废弃了 sitemap ping 接口
预防建议
- 重要页面绝不只靠 JS 渲染链接,永远 SSR / SSG 输出
<a href> - 保证每篇文章 ≤2 次点击可达(首页 → /articles 索引 → 文章)
- 内链按 topic cluster 组织,每个 hub 页面集中链接相关文章
- 内链锚文本永远是话题词,不要 “more” / “read”
- 监控 Crawl Stats → 抓取响应时间,> 1000ms 立刻优化
FAQ
Q:Ping sitemap 能帮忙吗? A:帮助很小,且 Google 2023 起废弃了官方 ping endpoint。最大信号是”这个 URL 能不能从站内权威页直接到达”。
Q:HTML sitemap 换成 JSON 有用吗? A:没用,sitemap 格式不是瓶颈。
Q:用 Cloudflare 缓存能改善 Googlebot 响应时间吗? A:能,特别是文章页静态化后缓存命中能让响应时间从 800ms 降到 50ms。