本文约 3,362 字,预计阅读 9 分钟。文中命令与配置均经过实测,可直接参考执行。
引言:一行 Disallow,收录从 3000 掉到 0
robots.txt 是站点里唯一一个”写错一行就能让整个网站从搜索结果消失”的文件。它没有语法检查、没有报错提示、改完之后不会有任何告警,直到某天站长发现收录量暴跌。最常见的情形有三种:上线时为了防爬写了 Disallow: / 之后忘了改;迁移服务器时 robots.txt 没跟着搬,新环境返回 404 或返回了安装向导的默认内容;用了”防采集”插件,结果插件把 Baiduspider 也一起拦了。本文给出一份面向百度的推荐写法,并逐个拆解高频错误。
原理分析:匹配规则不是”谁写在前面谁赢”
robots.txt 由若干组(group)构成,每组以 User-agent 开头,后面跟 Allow / Disallow 行。理解三点就够:
第一,User-agent: * 是通配组,对未被前面特定组命中的爬虫生效。如果同时存在 User-agent: Baiduspider 组和 User-agent: * 组,百度蜘蛛只服从 Baiduspider 组,* 组对它无效。
第二,同一组内多行规则命中同一 URL 时,采用”最长匹配优先”原则,而不是按顺序第一条生效。也就是说 Disallow: /wp-admin/ 与 Allow: /wp-admin/admin-ajax.php 谁写在前面都行,最终 admin-ajax.php 因为匹配更长而被允许。
第三,匹配是前缀匹配,且区分大小写。写 Disallow: /Tag/ 不会影响 /tag/;写 Disallow: /post 会连带屏蔽 /posts、/poster。
注意:robots.txt 只能”禁止抓取”,不能”禁止索引”。被 Disallow 的 URL 仍可能因为外链而被收录(只是没有摘要)。要真正从索引里移除,应该用 noindex(meta robots 或 HTTP 头 X-Robots-Tag),而 noindex 生效的前提是这个页面必须能被抓取——所以两者要配合使用,单独用 robots 屏蔽 noindex 页面反而会让 noindex 永远读不到。
保姆级实操
第一步:写一份基础版 robots.txt(放在站点根目录,UTF-8 编码)
User-agent: Baiduspider
Disallow: /wp-admin/
Allow: /wp-admin/admin-ajax.php
Disallow: /wp-login.php
Disallow: /?s=
Disallow: /search
Disallow: /*?replytocom=
Disallow: /*?utm_
Allow: /
User-agent: *
Disallow: /wp-admin/
Allow: /wp-admin/admin-ajax.php
Disallow: /wp-login.php
Disallow: /?s=
Disallow: /search
Sitemap: https://mimangfei.com/wp-sitemap.xml
说明:Sitemap: 行与 User-agent 组无关,放在文件任何位置都会被解析;Disallow: /*?utm_ 用于屏蔽带推广参数的重复 URL,但要小心别误伤正常参数。
第二步:不要屏蔽 CSS/JS
早期很多人写 Disallow: /wp-includes/、Disallow: /wp-content/,这会让百度抓不到主题样式与脚本,抓取诊断里看到的是”裸 HTML”,直接影响页面体验判断。正确做法是放开 /wp-content/ 与 /wp-includes/。
第三步:在 WordPress 里动态维护
虚拟 robots.txt(WordPress 默认地址 /robots.txt 由程序输出)可以用 robots_txt 过滤器追加规则,避免手改文件被覆盖:
<?php
add_filter( 'robots_txt', function ( $output, $public ) {
$extra = "Disallow: /?s=\n";
$extra .= "Disallow: /search\n";
$extra .= "Disallow: /*?replytocom=\n";
// 只给百度追加:用注释分组形式单独声明
$baidu = "User-agent: Baiduspider\n" . $extra . "\n";
$output = $baidu . $output;
$output .= "\nSitemap: " . home_url( '/wp-sitemap.xml' ) . "\n";
return $output;
}, 10, 2 );
第四步:验证是否生效
直接在浏览器访问 https://域名/robots.txt 看内容;再用资源平台「抓取诊断」或 curl 确认返回 200 且 Content-Type 为 text/plain。
curl -s -o /dev/null -w '%{http_code} %{content_type}\n' https://mimangfei.com/robots.txt
curl -s https://mimangfei.com/robots.txt
第五步:改完观察 3–7 天
robots 的变更不会立刻反映,百度需要重新抓取该文件。观察日志里 Baiduspider 的抓取量与资源平台索引量曲线。
第六步:误封后如何补救(也可用百度抓取诊断工具使用技巧逐条确认页面是否已恢复可抓取)
立刻修正文件 → 在资源平台的 robots 工具/抓取诊断确认可抓取 → 通过 API 主动推送重新提交核心页 → 等待数天至数周恢复。
常见踩坑
Disallow: /写在User-agent: *组里:全站封禁,所有爬虫(包括 Googlebot)全部受阻。- 屏蔽
/wp-content/:百度抓不到 CSS/JS,页面被判为”无法正常渲染”,移动端体验分下降。 - 把 sitemap 地址也 Disallow 了:一边声明 Sitemap 一边封掉路径,自相矛盾。
- 大小写写错:
Baiduspider必须严格按此拼写,baiduspider在部分解析器下不生效。 - 子站点/多域名共用根目录:
m.example.com与www.example.com的 robots 是各自独立的,需要分别配置。 - 案例:某站做安全加固时,运维在 Nginx 里加了一条
location / { if ($http_user_agent ~* "spider") { return 403; } },本意是挡垃圾爬虫,结果 Baiduspider 全部 403。一周后索引量从 3200 掉到 260。排查手段是看日志里 403 的 UA 分布——如果 403 里大量是 Baiduspider,问题立刻定位。 - robots 里写 noindex:
noindex不是 robots 协议的合法指令,写进去不产生任何作用。
总结
判断标准:把 robots.txt 想象成”抓取白名单说明书”——只要不是明确需要屏蔽的目录,就一律放开;需要彻底不收录的页面,用 noindex 而不是 Disallow。行动清单:根目录放 UTF-8 明文文件 → Baiduspider 组与 * 组分别声明 → 只封后台、搜索、参数页 → 放开 wp-content/wp-includes → 声明 Sitemap → curl 验证 200 → 改完观察一周日志。低质量页面的屏蔽策略可进一步参考用robots屏蔽低质量页面的正确方式。
