搜索全站
百度SEO 9 分钟阅读

百度 robots.txt 正确写法:Baiduspider 规则与 7 个致命错误

robots.txt 写错会导致全站收录归零。本文给出面向百度的推荐写法,解析 Disallow/Allow 匹配规则、Sitemap 声明位置、WordPress 动态 robots 的钩子实现,并列出 7 个真实高频致命错误。

U
UFO_PF 2019-05-26 · 阅读 9 分钟
百度 百度SEO
阅读提示
本文约 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 主动推送重新提交核心页 → 等待数天至数周恢复。

常见踩坑

  1. Disallow: / 写在 User-agent: * 组里:全站封禁,所有爬虫(包括 Googlebot)全部受阻。
  2. 屏蔽 /wp-content/:百度抓不到 CSS/JS,页面被判为”无法正常渲染”,移动端体验分下降。
  3. 把 sitemap 地址也 Disallow 了:一边声明 Sitemap 一边封掉路径,自相矛盾。
  4. 大小写写错:Baiduspider 必须严格按此拼写,baiduspider 在部分解析器下不生效。
  5. 子站点/多域名共用根目录:m.example.com 与 www.example.com 的 robots 是各自独立的,需要分别配置。
  6. 案例:某站做安全加固时,运维在 Nginx 里加了一条 location / { if ($http_user_agent ~* "spider") { return 403; } },本意是挡垃圾爬虫,结果 Baiduspider 全部 403。一周后索引量从 3200 掉到 260。排查手段是看日志里 403 的 UA 分布——如果 403 里大量是 Baiduspider,问题立刻定位。
  7. robots 里写 noindex:noindex 不是 robots 协议的合法指令,写进去不产生任何作用。

总结

判断标准:把 robots.txt 想象成”抓取白名单说明书”——只要不是明确需要屏蔽的目录,就一律放开;需要彻底不收录的页面,用 noindex 而不是 Disallow。行动清单:根目录放 UTF-8 明文文件 → Baiduspider 组与 * 组分别声明 → 只封后台、搜索、参数页 → 放开 wp-content/wp-includes → 声明 Sitemap → curl 验证 200 → 改完观察一周日志。低质量页面的屏蔽策略可进一步参考用robots屏蔽低质量页面的正确方式。

U
UFO_PF作者

专注 WordPress 生态的实战作者,内容以「可复制、可验证」为第一原则。

留下你的想法

邮箱地址不会被公开。带 * 的为必填项。