许可不等于排除
robots.txt 收回抓取某个网址的许可,仅此而已。谷歌把话说得很直白:它不是把页面挡在搜索之外的机制。这两件事被反复混为一谈,而这种混淆会造成一种非常具体、也很显眼的故障。
被其他网站链接的屏蔽网址,依然可能进入索引。有人链接过,所以谷歌知道这个地址存在,只是看不见上面有什么。于是它可能在结果里完全没有描述地列出来——两头落空:页面公开出现在结果中,而你对它的呈现方式毫无控制。
怎么读、怎么写这个文件
文件位于某个主机的根目录,只对该主机与该协议生效。规则按 user-agent 分组,抓取工具只遵守与自己最贴合的那一组,而不是所有可能匹配的组。在同一组内,谷歌按更具体的规则裁定冲突,而不是按书写顺序。
User-agent: *
Disallow: /admin/
Disallow: /*.pdf$
Allow: /admin/public/
User-agent: Googlebot
Disallow: /drafts/
Sitemap: https://example.com/sitemap.xml 这个例子里的两处细节,几乎承担了全部误解。Allow 行比它上面的 Disallow 更具体,所以 /admin/public/ 仍可抓取。而只要存在 Googlebot 分组,Googlebot 就只遵守那一组——通配符分组对它不再适用,于是这里的 /admin/ 对 Googlebot 反而是放行的。这几乎从来不是作者的本意。
- 屏蔽一条路径不会清除已经收录的网址,只会停止之后的抓取。
- Sitemap 指令独立于任何 user-agent 分组,放在文件的任何位置都可以。
- robots.txt 本身返回 5xx,可能让抓取工具对整台主机收手,所以要从可靠的地方提供它。
一条 robots 规则如何在很远的地方造成损害
代价最高的 robots.txt 错误,不是你本想屏蔽的那些页面,而是页面渲染时所需要的资源。搜索引擎在收录之前会渲染页面,而渲染会去拉取脚本、样式和接口响应。
屏蔽掉脚本目录或某个 API 路由,抓取工具照样能把 HTML 取回来。随后它渲染出一个近乎空白的页面,并收录一个近乎空白的页面。任何报告都不会说这个页面被屏蔽了,因为被屏蔽的不是页面本身,而是它所依赖的东西。
站点地图是建议,不是排队
站点地图恰恰在链接最薄弱的地方帮上忙:大型网站、外链稀少的全新网站,以及缺乏自然锚文本的媒体型网站。谷歌直言,列出一个网址既不保证抓取也不保证收录。
谷歌自己的说法是,规模不大、内链完善的网站可能根本不需要它,因为抓取工具顺着链接就能找全。在为一个内链本可更好解决的问题去搭建站点地图设施之前,这一点值得认真对待。
| 上限 | 数值 |
|---|---|
| 每个文件的网址数 | 5 万 |
| 每个文件未压缩体积 | 50 MB |
| 超出其中任何一项 | 拆分,并用站点地图索引引用各个分片 |
哪些标签会被读取、忽略或怀疑
站点地图上的力气,大多浪费在这里。四个常见标签里有两个什么也不做,第三个还可能反过来对你不利。
| 标签 | 谷歌如何处理 |
|---|---|
| loc | 读取——网址本身 |
| lastmod | 只有在一贯且可核实地准确时才使用 |
| changefreq | 忽略 |
| priority | 忽略 |
真正咬人的是 lastmod 的那个条件。如果构建流程给每个网址都盖上部署时间戳,那么每个值既是错的,又极易被戳破:页面并没有变,而搜索引擎看得出来。一旦它不再信任这个字段,就不再使用它,你的处境反而比根本不提交 lastmod 更差。只在正文真正发生变化时输出它,与其编造,不如省略。
<?xml version="1.0" encoding="UTF-8"?>
<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">
<url>
<loc>https://example.com/guides/indexing/</loc>
<lastmod>2026-06-14</lastmod>
</url>
</urlset> 挑对工具
这个领域里几乎所有问题,在你把三件看着相似、其实不同的事分开的那一刻就解开了。
| 目标 | 工具 | 原因 |
|---|---|---|
| 别把抓取浪费在垃圾网址上 | robots.txt | 从源头阻止抓取 |
| 把页面挡在结果之外 | noindex,或登录验证 | 需要先抓取,指令才读得到 |
| 帮助页面被发现 | 先内链,再站点地图 | 链接带着上下文,站点地图条目没有 |