robots.txt 怎么写才不挡住爬虫:5 个 Disallow 陷阱与抓取诊断实战

2026-10-09 01:16:46 3 次浏览
SEO技术SEOrobots.txtGoogle Search Console抓取与索引

上个月接手一个做工业设备的 B2B 官网,收录量从 1200 掉到 80,运营以为是内容问题,折腾了两周没结果。我拉出根目录的 robots.txt 一看,改版时运维加了一行 Disallow: /api,本意是挡接口,结果站内有一批 SEO 落地页路径是 /api-doc/xxx,全部被前缀匹配误伤。说白了,robots.txt 是整个站点里权重最高、又最容易被随手改坏的一个文件:十几行配置,能决定搜索引擎能不能看见你的站。

这篇文章把企业官网里最常见的 5 个 Disallow 陷阱逐个拆开,每一条都配真实写法、错误后果和修正方式,再走一遍用 Google Search Console(GSC)和百度搜索资源平台做抓取诊断的完整流程。

先搞清楚原理:爬虫是怎么读 robots.txt 的

很多人把 robots.txt 当成防火墙,这是第一个认知偏差。它本质是 Robots 排除协议(Robots Exclusion Protocol):合规爬虫在抓取站点任何 URL 之前,会先请求根目录下的 /robots.txt,解析出针对自己 User-Agent 的规则组,再决定这个 URL 是抓还是不抓。注意两个关键词:根目录(子目录里放 robots.txt 没用)、建议(恶意爬虫根本不理它,所以它挡不住扫描器,只影响搜索引擎)。

robots.txt 怎么写才不挡住爬虫主题图

一个主流爬虫处理单个 URL 的决策过程大致如下:

sequenceDiagram
    participant C as "爬虫调度器"
    participant R as "robots.txt 解析器"
    participant W as "Web 服务器"
    C->>W: GET /robots.txt
    W-->>C: 200 返回文件内容
    C->>R: 按自身 User-Agent 找规则组
    R->>R: 逐条匹配最长前缀规则
    alt 匹配到 Disallow 且无更长 Allow
        R-->>C: 结果为"禁止抓取"
        C->>C: URL 不进入抓取队列
    else 无 Disallow 或 Allow 更长
        R-->>C: 结果为"允许抓取"
        C->>W: 正常请求目标页面
    end

还有一条容易忽略的规则:分组匹配。User-agent: * 定义的组只对「没有专属规则组」的爬虫生效。如果你给 Googlebot 单独写了一组,Googlebot 就只看自己那组,通配组里写的限制对它一概不生效。不少站点「明明 Disallow 了却还是被抓」,根源就是规则写进了错误的组。这是后续所有陷阱的机制基础。

陷阱一:路径前缀误伤,挡了 /blog 连带 /blogging

Disallow 的匹配逻辑是字符串前缀匹配,不是目录匹配。Disallow: /blog 会同时命中 /blog、/blog/2024、/blogging-tips、/blog.html。某个客户站屏蔽旧版商城 Disallow: /shop_old 时顺手写了 Disallow: /shop,结果新版商城 /shop/p/123 全军覆没,两周掉了 400 多条收录。

修正方式有两种,按意图选:

意图 错误写法 正确写法
只挡目录本身及目录下内容 Disallow: /blog Disallow: /blog/
只挡这一个文件 Disallow: /file Disallow: /file$
挡所有以 /tag 开头的路径 Disallow: /tag Disallow: /tag(此场景前缀写法反而是对的)

规则:写完任何一条 Disallow,都到站内搜索一遍以这个前缀开头、但你不想屏蔽的路径。企业官网常见的重灾区还有 /search(误伤 /search-help 帮助页)和 /user(误伤 /user-guide 文档栏目)。

陷阱二:大小写与 URL 编码,匹配是「字节级」的

robots.txt 的路径匹配对大小写敏感(路径部分如此;User-agent、Allow 这些指令名不敏感)。Nginx 或 CDN 做了小写归一化的站点尤其容易翻车:你在 robots.txt 写 Disallow: /Search?,但站内实际链接是 /search?q=,Google 抓到的就是后者,规则完全落空。反过来,如果服务器同时响应 /Search 和 /search 两个版本,那就要各写一条,或者用通配符 Disallow: /[Ss]earch 兜底。

URL 编码是另一个隐形坑。中文栏目路径 /产品/工业泵,在爬虫实际请求的 URL 里是百分号编码形式,也就是 %E4%BA%A7%E5%93%81/...。规范要求 robots.txt 里的路径使用与实际抓取 URL 相同的编码形式。实践建议只有一条:别在 robots.txt 里写中文路径,直接复制 GSC 网址检查或服务器访问日志里出现的原始编码 URL 来比对。我们排查过的案例里,有人手写 %E4%BA%A7%E5%93%81 时漏了一个百分号,规则静默失效了三个月,没人发现——因为 robots.txt 写错了不报错,它只是不生效。

陷阱三:通配符 * 和 $ 的语义,多数人只用对了一半

* 匹配任意长度任意字符,$ 表示路径到此结束。这两个符号 Google、Bing、百度都支持,但语义细节常被写错。

典型场景一:屏蔽所有 PDF 文件。Disallow: /*.pdf 看似没问题,但它会连带挡掉 /manual.pdf.html 这种页面。加结束符才是准确意图:

Disallow: /*.pdf$

典型场景二:屏蔽带参数的 URL。Disallow: /*? 挡住所有带问号的 URL,这条很常用,但要先确认站内没有依赖参数做收录的页面(比如分页 ?page=2 恰恰需要被收录),否则一挡一个准。某企业站写了 Disallow: /*?from= 想挡推广参数,结果连 ?from=east 和 ?fromalibaba 这类路径全部命中——* 匹配的是「?from=」这个子串出现在任意位置,不是「参数开头」。

典型场景三:$ 的位置感。Disallow: /*?$ 几乎永远匹配不到东西(问号后面是查询串,$ 锚定在整条路径末尾),这种写法属于「看起来专业、实际空转」。写完通配符规则,必须用 GSC 的 robots.txt 报告逐条测试,后面诊断部分会演示。

陷阱四:Disallow 空值与 Allow 顺序,最短规则反而赢

两条语义规则必须背下来:

  1. Disallow:(后面空着)= 允许抓取所有内容,不是「什么都不允许」。想全站开放就写空值,或者干脆整个文件只留 Sitemap。而 Disallow: /(一个斜杠)才是全站禁止——这两个写法只差一个字符,线上事故里出现频率高得离谱。
  2. 同组内多条规则冲突时,按「匹配长度最长者胜」,与书写顺序无关。也就是说 Allow: /blog/ 写在 Disallow: /blog 前面还是后面都无所谓,/blog/post-1 会命中更长的 Allow,从而被放行。

理解了「最长匹配」,就能做精细控制了。经典用例:全站禁止抓取,但放行某个目录:

User-agent: *
Disallow: /
# 更长的 Allow 会覆盖上面的全站禁令,顺序无关
Allow: /public/

但要小心百度的历史行为:旧版百度爬虫对 Allow 的支持与 Google 存在过差异,涉及关键栏目时,别只依赖 Allow 做「豁免」,更稳妥的办法是收紧 Disallow 前缀本身,让规则不需要冲突就能表达意图。

陷阱五:Sitemap 指令位置与组结构混乱

Sitemap 指令不属于任何一个 User-agent 组,它是文件级指令。写在某个组内部,Google 能容忍,但部分爬虫(以及一些校验工具)会忽略它。标准做法是放在文件末尾、所有组之外,且一个文件可以写多条 Sitemap。

组结构混乱是另一类事故。正确的分组结构是:User-agent 行开启一个组,组内的 Disallow/Allow 连续书写,中间用空行分隔。下面这种写法就是错的——中间插入了别的指令,导致组被截断:

User-agent: *
Disallow: /admin/
Sitemap: https://example.com/sitemap.xml
Disallow: /tmp/

部分解析器会认为 Sitemap 之后是新内容,Disallow: /tmp/ 的归属变得不确定。保证同一个组的规则块里只出现 User-agent、Disallow、Allow、Crawl-delay 四类指令,Sitemap 单独放在文件末尾,这是最省心的结构。

一份可直接用的企业官网 robots.txt 模板

综合上面五个陷阱,给出我们给企业官网交付时用的基准模板:

# 企业官网 robots.txt 基准模板
# 部署位置:站点根目录,必须能通过 https://你的域名/robots.txt 直接访问到

# ---------- 通用规则组(对所有未单列的爬虫生效) ----------
User-agent: *
# 放行 well-known 目录,站点验证和安全文件需要它
Allow: /.well-known/
# 屏蔽站内搜索结果页,避免抓取预算被无价值页面吃掉
Disallow: /search?
# 只挡 admin 目录本身,不会误伤 /administrator-guide 之类的路径
Disallow: /admin/
# 挡临时目录,前缀加了结尾斜杠,语义更窄
Disallow: /tmp/
# 屏蔽带追踪参数的 URL,注意先确认没有依赖参数收录的页面
Disallow: /*?utm_

# ---------- 图片爬虫单独放行 ----------
User-agent: Googlebot-Image
# 空值 = 全部允许,保证图片搜索收录不受上面规则影响
Disallow:

# ---------- Sitemap 必须放在所有组之外、文件末尾 ----------
# 可以写多条,一行一条
Sitemap: https://example.com/sitemap.xml
Sitemap: https://example.com/sitemap-news.xml

逐段看注释就能对上前面五个陷阱:前缀收窄、编码问题绕开(模板里没有任何中文路径)、通配符带明确语义、空值用法正确、Sitemap 位置独立。

诊断验证:GSC 与百度搜索资源平台的完整流程

写完只是第一步,没有经过工具验证的 robots.txt 都默认是错的。诊断流程如下:

flowchart TD
    A["部署 robots.txt 到根目录"] --> B["GSC robots.txt 报告查看解析结果"]
    B --> C{"报告有无语法或逻辑警告"}
    C -- "有" --> D["修正规则后重新提交拉取"]
    C -- "无" --> E["网址检查:抽查核心栏目 URL"]
    E --> F{"网址是否显示'允许抓取'"}
    F -- "否" --> G["定位命中的 Disallow 前缀并修改"]
    G --> B
    F -- "是" --> H["百度搜索资源平台抓取异常工具复查"]
    H --> I["观察 7-14 天收录与抓取统计"]

第一步,GSC 侧边栏进入「设置 → robots.txt」,报告会展示 Google 实际拉取到的文件内容、上次拉取时间和逐条规则的解析结果。如果文件存在语法问题(比如把 Sitemap 写进了组内),这里会直接报出来。更关键的是页面上有一个实时测试框,输入任意 URL 能告诉你命中了哪条规则——陷阱三里那些通配符规则,只有在这里逐条测过才算数。

第二步,「网址检查」输入核心栏目页(首页、产品列表、重点文章),看「网址是否受 robots.txt 限制」这一项。注意一个细节:被 robots.txt 屏蔽的 URL 仍可能出现在搜索结果里(如果有外链指向它),robots.txt 挡的是抓取,不是索引;想让页面彻底不出现在结果里,需要的是 noindex,这引出了下一节的分工问题。

第三步,百度侧。进入百度搜索资源平台,「资源提交 → 普通收录」旁的「抓取异常」工具会列出抓取失败、404、以及被 robots 屏蔽的 URL 样本;「抓取诊断」工具可以让百度蜘蛛实地抓一次你指定的 URL,返回抓取结果和命中状态。两边平台都过一遍,验证才算跑通。

除了平台工具,命令行可以做一层前置自检:

#!/usr/bin/env bash
# 抓取诊断自检脚本:验证 robots.txt 是否挡住了不该挡的 URL
# 依赖:curl、grep;Windows 环境在 Git Bash 中直接运行

SITE="https://example.com"

# 第 1 步:确认 robots.txt 返回 200 而不是 404 或 302
# 404 等于全部允许,302 可能导致部分爬虫读不到文件内容
curl -s -o /dev/null -w "robots.txt 状态码: %{http_code}\n" "$SITE/robots.txt"

# 第 2 步:模拟 Googlebot 的 UA 拉取 robots.txt
# 有些 CDN 会针对 User-Agent 返回不同内容,必须用真实爬虫 UA 验证
curl -s -A "Mozilla/5.0 (compatible; Googlebot/2.1)" \
  "$SITE/robots.txt" | grep -n "Disallow"

# 第 3 步:抽查核心页面状态码
# 把第 2 步输出的 Disallow 前缀和核心栏目逐条比对
for path in "/products/industrial-pump" "/blog/seo-guide" "/about"; do
  # 逐个打印状态码,出现 404 或 301 都要回源站排查
  curl -s -o /dev/null -w "%{http_code}  $SITE$path\n" "$SITE$path"
done

这个脚本三十秒能跑完,却能在上线前拦下绝大多数前缀误伤问题——比等收录掉了再排查,成本低一个数量级。

分工边界:robots.txt、meta robots 与 X-Robots-Tag 各管什么

三套机制经常被混用,混用的结果就是「想挡的没挡住、想收的没收进来」。它们的能力边界如下:

维度 robots.txt meta robots X-Robots-Tag
作用层面 抓取(能不能来抓) 索引(抓了要不要收录) 索引(同左,作用于 HTTP 响应头)
作用对象 整站 / 路径前缀 单个 HTML 页面 任意资源,含 PDF、图片
是否要求页面可被抓取 — 是,页面得先能被抓到才能读到 是
典型用法 屏蔽后台、参数页 控制分页、感谢页不收录 屏蔽整站 PDF 不进索引

核心结论:robots.txt 禁止抓取的页面,爬虫根本不会请求它,也就读不到页面里的 noindex。所以「既不收录、又允许搜索引擎知道它存在」的需求,不能用 robots.txt 实现,要用 meta robots 的 noindex。反过来的场景:已收录页面想让它退出索引,先别急着加 robots.txt 屏蔽——那会让爬虫看不到 noindex 指令,页面反而可能带着旧快照挂更久。正确顺序是先放 noindex、等索引清理完成,再决定要不要屏蔽抓取。抓取预算(crawl budget)优化的思路也在这里:robots.txt 用来把抓取份额从低价值路径(参数、搜索、会话页)挪给高价值栏目,索引层面的控制则交给 meta 和响应头。

改造前后的真实对比

回到开头那个工业设备站。我们做了三件事:修正 /api 前缀为 /api/、把误伤的 /api-doc/ 用更长 Allow 豁免、Sitemap 挪到文件末尾独立成段。改造前后关键差异:

检查项 改造前 改造后
Disallow 条数 9 条(含 4 条误伤) 6 条(逐条经 GSC 验证)
核心栏目可抓取性 3 个栏目被屏蔽 全部放行
Sitemap 位置 组内 文件末尾独立
有效收录量(14 天后) 80 回升到 900+
抓取异常(百度平台) 每天 200+ 条 降到个位数

收录回升有滞后性,robots.txt 修正后一般 1-2 周才能看到收录数据明显变化,别改完第三天就下结论。期间可以每天看 GSC 的「抓取统计信息」报告里的「每日平均抓取次数」和抓取响应分布,确认爬虫真的回来了。

顺带一提:AI 爬虫也在读这份文件

GPTBot、ClaudeBot、Google-Extended 这些 AI 数据采集爬虫同样遵守 robots.txt 协议,也会解析你的 Disallow 规则。如果你的内容策略允许 AI 抓取,现状规则不用动;如果想对 AI 爬虫单独设限,给它们各开一个 User-agent: GPTBot 组即可——记住前面讲的分组规则,单列之后它们就只看自己那组。这算是 robots.txt 在 2024 年之后多出来的一层职责,写规则时值得把目标爬虫清单过一遍。

收尾:三个高频误区

误区一:「robots.txt 挡住 = 不收录」。挡住只影响抓取,外链够多照样进结果。误区二:「写错会报错」。robots.txt 从不报错,它只是静默地不生效或过度生效,这也是它最危险的地方——可靠的防线只有一条:定期用 GSC 的 robots.txt 报告做验证,建议纳入每次发版的检查清单。误区三:「屏蔽越多对 SEO 越好」。抓取预算要花在刀刃上,但过度屏蔽会让爬虫失去发现新页面的入口,参数页治理用 canonical 和 meta 往往比一刀切 Disallow 更合适。

robots.txt 就是一个十几行的文本文件,但它处在搜索引擎认知你网站的入口位置。写的时候对每条 Disallow 多问一句「这个前缀还会命中什么」,上线后用平台工具逐条验证,五分钟的动作能省掉几周的收录排查。你在线上踩过哪些 robots.txt 的坑,欢迎评论区交流。

参考与延伸

  1. Google 搜索中心 — robots.txt 入门:https://developers.google.com/search/docs/crawling-indexing/robots/intro
  2. Google 搜索中心 — robots.txt 规范与通配符语法:https://developers.google.com/search/docs/crawling-indexing/robots/robots_txt
  3. Google 搜索中心 — Googlebot 抓取概述:https://developers.google.com/search/docs/crawling-indexing/googlebot
  4. robotstxt.org — robots.txt 协议原始说明:https://www.robotstxt.org/robotstxt.html

关键词:robots.txt、Disallow、抓取诊断、Google Search Console、百度搜索资源平台、抓取预算、技术SEO

🤖
本内容由 AI 辅助生成,经人工校对审核;部分素材、资料来源于公开网络,仅作个人观点分享与交流使用,无任何商业侵权意图。若内容、图片、文字涉及您的合法著作权、版权权益,请联系本人,核实后将第一时间删除、修改相关内容。