很多站点把 robots.txt 当成一个“优化开关”,其实它更像抓取入口上的一道门。写对了,蜘蛛不会把时间耗在没意义的地址上;写错了,本该被抓到的页面可能连请求都收不到。下面按“它管什么、怎么写、怎么分放行和拦截、改完怎么看”四个部分说。
robots.txt 管的是抓取,不是收录
robots.txt 的规则作用在抓取环节。被 Disallow 的 URL,蜘蛛通常不会去请求,自然也拿不到页面内容。这里有两个容易被忽略的点:一是被拦住不等于一定不会被索引,如果别处有指向它的链接,地址本身仍可能出现在结果里,只是缺少摘要信息;二是“希望它别被收录”的正确做法,一般是放行抓取、让页面返回 noindex,而不是直接在 robots 里拦掉。
拦掉一个页面,同时也拦掉了它身上的 noindex。想让蜘蛛看到“别收录”的指令,前提是它能抓到页面。
写法上的几个关键点
User-agent 与分组
每个规则组以 User-agent 开头,可以写具体蜘蛛名,也可以用 * 匹配其余蜘蛛。同一文件里可以有多组,但一组内不要混写多个 User-agent 再配一堆含义不一致的规则,容易产生理解偏差。多数搜索引擎蜘蛛只认自己那一组或 * 组。
Disallow 与 Allow
Disallow 表示不允许抓取的路径前缀,Allow 用来在已拦截的范围里开一个口子。主流蜘蛛的常见规则是路径更长、更具体的优先。典型写法是先拦掉整个目录,再用 Allow 放行其中一个子路径。
- Disallow 后留空表示不限制,基本等于全部放行。
- 只写 Disallow: / 会把整站挡在外面,除非确实想这样。
- 路径区分大小写,/Search 和 /search 在部分实现里并不等价。
- 结尾不加斜杠时含义不同,/admin 会同时匹配 /admin 和 /administrator。
通配符的用法
* 匹配任意字符,$ 表示路径结束。例如用 /*?sort= 拦住带排序参数的地址,用 /*.pdf$ 拦住以 .pdf 结尾的文件。通配符别放得太宽,否则容易误伤正常内容页。
哪些地址适合放行,哪些适合拦
建议放行
- 正常的内容页、栏目页、详情页
- 承载内容与排版的 CSS、JS 和图片
- Sitemap 文件本身
通常建议拦截
- 后台、登录、编辑、草稿类地址
- 站内搜索结果页,尤其是带查询参数的
- 购物车、下单、支付流程
- 会话 ID、跟踪参数生成的重复地址
- 测试环境、临时目录、备份文件
判断标准可以很简单:这个地址被蜘蛛抓到之后,除了消耗抓取,还能带来什么。如果它不会作为落地页出现,也没有指向有价值内容的链接,拦掉通常更划算。
容易踩的几个坑
- 拦掉了 CSS 和 JS,蜘蛛拿不到样式和渲染所需脚本,看到的页面可能是残缺的。
- 在 robots 里拦掉页面,同时又指望该页面的 noindex 生效,两个指令互相矛盾。
- 上线时用 Disallow: / 做临时遮挡,后来忘了删除,站点长期处于被挡状态。
- 在规则组里写 Crawl-delay,但蜘蛛不一定遵循,别把它当成真正的限速开关。
- robots.txt 本身返回 404 或 5xx,蜘蛛在拿不到规则时的处理各不相同,都不理想。
- Sitemap 声明写成相对路径或错误域名,抓取指引等于没写。
改完之后怎么验证
修改 robots.txt 不需要手动“提交”,但要确认它生效。可以做的几件事:直接用浏览器访问 /robots.txt,确认返回码和内容;用搜索引擎提供的 robots 测试工具检查某条 URL 是被放行还是被拦;对比改前改后的服务器日志,看被拦路径的请求量是否下降、内容页的抓取是否更集中。生效存在延迟,蜘蛛可能还会按旧规则再跑一段时间。
最后提醒一句,robots.txt 只是抓取入口的控制手段,它不决定页面能不能被收录,也替代不了内链、Sitemap 和内容本身。把它当成“让蜘蛛少走冤枉路”的工具来用,比指望它解决所有抓取问题更现实。