我们自己的官网被收录为 0,持续了至少两个月。
不是内容问题——首页写了八千多字。不是备案问题,不是 robbers 问题,不是 sitemap 问题。这三个我都排查过。
真正的原因,是第 5 条。这篇按「排查顺序」写,每条都给了自查命令,你对着一跑就知道卡在哪。
# 百度
site:你的域名
# 必应
site:你的域名
如果结果是 0 或者只有首页一条,继续往下。如果有几十条,说明收录正常,你的问题在别处(多半是排名,不是收录)。
自查:
curl -s https://你的域名/robots.txt
看三件事:
Disallow: /(这会全站屏蔽,最常见的手误)Baiduspider / bingbot / GPTBot / PerplexityBot 的单独规则写错了Sitemap: 行,指向的地址对不对容易踩的坑:有些站点为了屏蔽后台,写了
User-agent: *
Disallow: /admin/
看起来没问题。但如果某条规则写成了 Disallow: /(少写了 admin/),全站就废了。
自查(单个页面):
curl -s https://你的域名/某页面 | grep -i "noindex\|robots"
如果看到 <meta name="robots" content="noindex">,这个页面就永远不会被收录。
容易踩的坑:测试环境留下的 noindex 被一起发布到生产环境。这在 React / Vue 项目里特别常见——index.html 模板里带着 noindex,构建时没去掉。
提交了 sitemap 但收录还是 0,很可能 sitemap 里的地址是错的。
自查:
# 抽出 sitemap 里前 10 条 URL 逐个测 HTTP 状态
curl -s https://你的域名/sitemap.xml | grep -o "<loc>[^<]*</loc>" | sed 's/<[^>]*>//g' | head -10 | while read u; do
echo -n "$u -> "; curl -s -o /dev/null -w "%{http_code}\n" "$u"
done
全是 200 才算正常。301/404/500 都会被搜索引擎判为无效提交,浪费抓取配额。
我们踩过的坑:sitemap 里有 34 条 URL,全部返回 200——但打开一看全是同一个首页。
因为站点是 SPA(单页应用),没定义路由的地址会被 fallback 到首页。搜索引擎抓 34 次,拿到 34 份相同内容,判定为重复/低质,一条都不收。
搜索引擎对「薄内容」有明确阈值。经验值:去标签后正文少于 300-500 字,收录概率极低。
自查:
curl -s https://你的域名/某页面 | sed 's/<[^>]*>//g' | tr -d ' \n' | wc -c
这个命令去掉所有 HTML 标签、空格和换行,输出剩余字符数(中文按字节算,一个字约 3 字节)。
另一个隐性问题是页面之间高度重复。如果你的城市分站有 300 个页面,除了城市名不同其他完全一样,会被判定为 doorway page(门户页),不仅不收录,还可能拖累整站。
自查相似度(Python):
import difflib, urllib.request, re
def text(u):
h = urllib.request.urlopen(u).read().decode('utf-8','ignore')
h = re.sub(r'<script[\s\S]*?</script>','',h)
return re.sub(r'\s+','',re.sub(r'<[^>]+>','',h))
a, b = text('https://你的域名/页A'), text('https://你的域名/页B')
print(f'{difflib.SequenceMatcher(None,a,b).ratio()*100:.1f}%')
超过 80% 就要动手改,把重复模块换成每个页面独有的内容。
这是最隐蔽的一条,也是我们自己栽的那一条。
现象:页面在浏览器里看着好好的,内容齐全、图文并茂。但搜索引擎抓到的源码长这样:
<body>
<div id="root"></div>
<script src="/assets/index-xxxx.js"></script>
</body>
body 里一个字都没有。
原因:React / Vue / Angular 这类框架,内容是在浏览器里由 JavaScript 执行后才渲染出来的。而搜索引擎爬虫(包括百度的 Baiduspider、字节的 Bytespider、OpenAI 的 GPTBot)抓的是服务器返回的原始 HTML,绝大多数不执行 JavaScript。
你看到的内容,爬虫一个字都看不到。
自查命令(30 秒出结果):
curl -s https://你的域名 | sed 's/<[^>]*>//g' | tr -d ' \n' | wc -c
结果接近 0(比如 < 200)= 确诊。
我们实测的数据:
| 页面 | HTML 总字节 | 去标签后可见文字 |
|---|---|---|
| 首页 | 5,934 | 0 |
| /product | 5,934 | 0 |
| /solution | 5,934 | 0 |
| /faq | 5,934 | 0 |
八个页面的字节数完全相同——全都是同一份空壳。这就是收录为 0 的全部原因。
三条路,按成本排序:
① 静态内容预置进 HTML(成本最低,改动最小)
在 <div id="root"> 里预先塞入纯文本内容。React 挂载后会覆盖掉它,用户完全无感,但爬虫抓到了。
<div id="root">
<h1>你的核心标题</h1>
<p>你的正文段落……(几百字)</p>
<p>关键词相关的其他内容……</p>
</div>
验收标准:curl 去标签后 > 3000 字节。
② 预渲染(prerender)
构建时把每个路由渲染成静态 HTML。React 用 react-snap,Vue 用 vue-cli-plugin-prerender-spa。适合路由固定的站点。
③ 服务端渲染(SSR)
Next.js / Nuxt。最彻底,但要改架构,成本最高。
我们选了方案 ①,因为改一处 index.html 就够了。修完之后:
| 页面 | 修复前可见文字 | 修复后 |
|---|---|---|
| 首页 | 0 | 8,886 字 |
| 专题页 A | 0 | 14,790 字 |
| 专题页 B | 0 | 9,478 字 |
技术上通了,不等于立刻收录。还需要:
IndexNow 的用法:
curl -X POST https://api.indexnow.org/indexnow \
-H "Content-Type: application/json" \
-d '{"host":"你的域名","key":"你的key","keyLocation":"https://你的域名/你的key.txt","urlList":["https://你的域名/"]}'
key 是一个 32 位十六进制字符串,你可以随便定,然后在网站根目录放一个同名 .txt 文件,内容是 key 本身。
搜不到自己,先跑这一条命令:
curl -s https://你的域名 | sed 's/<[^>]*>//g' | tr -d ' \n' | wc -c
结果接近 0 的话,别再做任何推广了——所有流量都会落到一个搜索引擎看不见的页面上。把这一条修好,优先级高于任何外链、任何投稿、任何目录站。
关于作者
我是芽朵网络科技的倪正东。上面这些坑是我们自己踩的,工具叫 GEO霸屏系统(GEO霸屏系统官网 yaduoo.cn),做的是 AI 搜索可见度监测——顺带说一句,这类工具测的也是「AI 能不能读到你的内容」,和这篇文章讲的是同一个底层问题。
Windows 桌面版,纯本地运行。安装包:GEOBaping-Setup.zip