上线第三周,我在 Google 里搜 site:patet.xyz。
一个结果。首页。
那会儿站里有二十多个页面,全部能正常打开,互相之间也有链接。
先说什么时候算正常
新站收录慢是正常的。从提交到被爬、被索引,几天到几周都算常见。所以前两周我什么都没做,只是等。
第三周还是只有一页,那就不是慢了。是堵了。
下面是排查顺序,按「从最明显到最隐蔽」排。我实际上也确实是这么一路查下来的。
一、robots.txt 是不是在拦
第一个该看的。我那份是从某个 starter 抄来的,一直没读第二行:
User-agent: *
Disallow: /整站屏蔽。写了跟没写一样,搜索引擎礼貌地一个都没进来。
Search Console 里能直接区分这件事:「已被 robots.txt 屏蔽」和「已发现,尚未编入索引」是两个完全不同的状态。前者是你在拒绝,后者是它在排队。
这个话题我在上一篇第八节提过,这里快速带过。改完,重新提交,等。
一周后,还是只有一页。
二、页面上有没有 noindex
翻源码,<head> 里很干净,没有。那就换个地方找。
noindex 有三个藏身处,除了 <meta> 标签还有两个:
X-Robots-Tag响应头。 最容易漏,因为它根本不在 HTML 里。- 构建时被注入。 有些模板在生产环境判断里留了开关,或者某个插件默认给非首页加
noindex。
用命令行确认比在浏览器里翻源码快:
curl -sI https://你的域名/某篇文章 | grep -i x-robots-tag
curl -s https://你的域名/某篇文章 | grep -i 'name="robots"'两条都空。排除。
三、canonical 指向了哪里
到这一步我有点没头绪,就把一个内页丢进 Search Console 的 URL 检查。
结果是「备用网页(有适当的规范标记)」:它认为这篇文章的正式版本在另一个地址。
那个地址是 http://localhost:3000。
我在代码里定义了一个 siteUrl 常量,用来拼 canonical、Open Graph 和 sitemap 里的绝对地址。部署那天我改了域名解析,改了环境变量,唯独忘了改这个常量。于是每一页的 <head> 里都写着同一句话:
<link rel="canonical" href="http://localhost:3000/blog/xxx"/>搜索引擎读到的是:这些页面的正式版本都在一个它访问不了的地址上。那它当然一个都不收。
这个坑之所以隐蔽,是因为页面本身完全正常——打开它、点链接、看排版,一点问题都没有。只有去翻网页源代码,或者看 Search Console 的规范标记报告,才会露馅。
顺手提醒一句:如果你的 canonical 指向 www 而实际域名是裸域(或者反过来),会得到一模一样的结果。这两个购买域名那篇里建议过,一开始就定好一个,另一个 301 过去。
四、sitemap 里真的有网址吗
最后一条,也是我最蠢的一条。
我确实提交了 sitemap.xml,Search Console 也确实显示「已读取」。但我从来没点开看里面有多少条。
我的 sitemap.xml 是构建时生成的,而生成它的那段代码读的是一份手写的路由清单。我后来加了页面,忘了往清单里加。结果 <urlset> 标签齐全,里面一条 <url> 都没有。
Search Console 那边只显示「成功」,不显示「发现了 0 个网址」。
教训:「已读取」不等于「有内容」。提交完顺手数一下:
curl -s https://你的域名/sitemap.xml | grep -c "<loc>"修完的结果
四条都改完的第二天,搜索结果开始变多。一周内大部分页面进了索引。
但我想说清楚一件事:收录不等于排名。
上面做的全是「让搜索引擎愿意进来、并且看得懂」。至于排在第几位,那是内容质量和外链的事,跟这篇无关。
三条结论
- 收录问题,绝大多数是「你自己告诉搜索引擎别收录」。 robots、noindex、canonical 这三件事,全是你自己写进去的,不是搜索引擎在针对你。
site:只是个粗略参考,数字不准,别拿它当 KPI。要看真实状态,用 Search Console 的覆盖率报告。- 每一步都要验证,别假设。 我这次栽的三个跟头,全是「我以为我配好了」。
站里的 SEO 优化 是正面清单,讲该做什么;这篇是反面清单,讲做错了长什么样。两份对着看,收录这条路基本能走通。
最后说个巧合:我上面栽的那三个跟头——robots、sitemap、canonical——正好就是上线自查清单里「SEO 与可发现性」那一节的三条。当时我要是先过一遍这份清单,能省下三周。