内链没被 Google 发现:3 个原因 + 修复路径

页面有 50 个内链,Search Console 链接报告显示 0——多半是 Googlebot 看不到:链接在 hydration 后才渲染、藏在折叠面板里或被 robots 拦。本文给三类原因和修复。

你网页上明明有 50 个内链指向各种文章,但 Search Console → 链接 → 内链报告里某些 URL 显示”0 内链”。或者 URL Inspection 工具显示 “Discovered – not indexed”,明明你已经从 5 个页面链过去了。

最常见的原因不是 Google 故意不算——是它根本看不到那些链接。Googlebot 默认不执行 JS、不点击、不展开折叠面板。你浏览器里看得见的链接,在 Google 抓取的快照里可能完全不存在。

常见原因

1. 内链在 hydration 后才渲染

React / Vue / Svelte 的 client-side rendered 链接,初始 HTML 里没有,全靠 JS 把组件挂载上去后才出现。

Google 虽然有 “Web Rendering Service” 能跑 JS,但:

  • WRS 不会等待异步加载(如 useEffect 里 fetch 完才渲染的列表)
  • WRS 资源有限,复杂 SPA 可能被跳过
  • 初始抓取常常先用”静态 HTML 快照”判断

如何判断

curl -sL https://yourdomain.com/page | grep -c "href=\"/article-"
# 数和你浏览器里看到的对比

或用 Search Console → URL 检查 → “测试实际网址” → “屏幕截图 + 查看抓取的 HTML”:搜你的内链,找不到说明被 JS 隐藏。

2. 链接在折叠面板 / 抽屉 / Tab 切换里

哪怕 HTML 静态生成,如果链接被 display: none 或在 <details> 默认折叠 / Tab 默认不显示,Google 大概率不计算(虽然技术上爬虫能看到 HTML,但权重打折)。

如何判断:搜你模板里的 display: nonehidden<details>tabpanel hidden 等。

3. 不小心加了 nofollow

<a href="/article" rel="nofollow">链接</a>

rel="nofollow" 告诉 Google “别跟过去也别传递权重”。出现位置常常是:

  • WYSIWYG 编辑器默认加 nofollow(很多 CMS)
  • 用户生成内容 (UGC) 模块自动 nofollow
  • 把外链模板复制过来用到了内链

如何判断

curl -sL https://yourdomain.com/page | grep -E 'nofollow|sponsored|ugc'
# 出现就是有

4. 链接是图片 onclick / button + JS 跳转

<button onclick="location.href='/article'">查看文章</button>
<div data-link="/article" class="card"></div>

这些不是 <a href> —— 对 Google 来说不存在内链。

5. 链接放在 noscript 或 iframe 里

<noscript> 内容 Google 大多忽略,iframe 里的链接不传递权重给主页面。

6. URL 在 robots.txt 被屏蔽

链接本身可见,但目标 URL 在 robots.txt 里 Disallow,Google 拒绝跟过去。

最短修复路径

Step 1:看 disabled-JS 下你的内链还在不在

# 抓静态 HTML
curl -sL https://yourdomain.com/your-page > raw.html

# 数 <a href>
grep -oE '<a [^>]*href="[^"]+"' raw.html | wc -l

# 与你浏览器里看到的对比(DevTools → Elements → Cmd+F 搜 href= 数量)

差值大 = 大多数链接靠 JS 渲染,Google 看不到。

Step 2:把关键内链改成 SSR / SSG

如果用 Next.js:

// 错:useEffect 里 fetch 后才渲染
function Related() {
  const [items, setItems] = useState([]);
  useEffect(() => { fetch('/api/related').then(r => r.json()).then(setItems); }, []);
  return items.map(i => <a href={i.url}>{i.title}</a>);
}

// 对:用 getStaticProps / getServerSideProps
export async function getStaticProps() {
  const items = await getRelated();
  return { props: { items } };
}
function Related({ items }) {
  return items.map(i => <a href={i.url}>{i.title}</a>);
}

Astro 默认就是 SSG,没这个问题;Vue 用 Nuxt 的 async data;Svelte 用 SvelteKit 的 load。

Step 3:把折叠 / Tab 里的关键链接展开

把”相关文章”模块从 <details> 改成默认展开的 <section>。Tab 切换内的核心导航也是。

如果设计上必须折叠,至少在 HTML 里输出全部链接 + 用 CSS 控制可见性,不要”折叠时 DOM 里都没有”。

Step 4:审查 rel=“nofollow”

# 全站扫
rg 'rel="[^"]*nofollow' src/

# 内链不应该有 nofollow,外链按需

修:CMS 的 WYSIWYG 默认 → 改成不加 nofollow;UGC 模块只对 user 提交内容加 nofollow,不要也包到模板自带的相关链接上。

Step 5:所有可点击元素改成 <a href>

<!-- 错 -->
<button onclick="location.href='/article'">查看</button>
<div data-link="/article" class="card">...</div>

<!-- 对 -->
<a href="/article" class="button">查看</a>
<a href="/article" class="card">...</a>

Step 6:用 Search Console URL Inspection 验证

修完后到 Search Console → URL 检查 → 输入页面 URL → “测试实际网址” → “查看抓取的 HTML”。Cmd+F 搜你的目标内链,找得到 = Google 看得到。

然后等 1-2 周看”内链”报告里目标 URL 的链接数是否上升。

预防建议

  • 关键内链永远 SSR / SSG,不要靠客户端 fetch 才出现
  • 用真正的 <a href>,杜绝 onclick / data-href 这类伪链接
  • CI 加 disabled-JS 抽测:curl 静态 HTML,确保关键内链数 ≥ X
  • nofollow 只用在 sponsored 外链 / UGC,模板里默认不加
  • 折叠 / Tab 设计先问 SEO:核心导航能不能默认展开

相关阅读

标签: #SEO #Google #Search Console #收录