从零开始理解 robots.txt:搜索引擎爬虫的“门禁系统“
在排查网站收录问题时,发现 Google 竟然索引了我们的 /api/ 接口页面和 /admin/ 后台登录页。这事儿挺尴尬的——敏感路径不应该被爬虫抓取。问题的根源是:我们压根没有配置 robots.txt。
这让我意识到,很多开发者对 robots.txt 的理解还停留在"听说过"的层面。今天就来聊聊这个看似简单、实则暗藏玄机的文件。

robots.txt 到底是什么?
简单说,robots.txt 是一个放在网站根目录的文本文件,用来告诉搜索引擎爬虫:“哪些页面可以抓,哪些页面不能碰”。
它就像一个门禁系统,但有个关键点:它是君子协定,不是强制约束。主流搜索引擎(Google、 Bing 、百度)会遵守,但恶意爬虫根本不在乎。
基本结构长这样:
User-agent: *
Disallow: /admin/
Disallow: /api/
Allow: /public/
Sitemap: https://example.com/sitemap.xml
User-agent:指定针对哪个爬虫,*表示所有爬虫Disallow:禁止访问的路径Allow:允许访问的路径Sitemap:告诉爬虫站点地图的位置
规则匹配的优先级陷阱
这是最容易踩坑的地方。看下面这个例子:
User-agent: *
Disallow: /
Allow: /public/
你可能以为这会"禁止所有,但允许 /public/"。实际上?所有页面都被禁止了。
原因在于:Disallow 和 Allow 的匹配规则是基于最长路径匹配。当两条规则冲突时,更具体的规则优先。但 / 和 /public/ 冲突时,/ 已经匹配了所有路径,Allow 根本没机会生效。
正确的写法是:
User-agent: *
Allow: /public/
Disallow: /
或者更精确的:
User-agent: *
Disallow: /
Allow: /public/
Allow: /static/
这里 Allow 规则更具体,会覆盖 Disallow。
通配符和正则表达式的误区
robots.txt 支持两种通配符:* 和 $。
*匹配任意字符序列$匹配路径结尾
举个例子:
User-agent: *
Disallow: /*.pdf$
Disallow: /temp/
Disallow: /search?q=*
这会禁止:
- 所有
.pdf结尾的文件 /temp/目录下的所有内容- 搜索结果页面(
/search?q=任意内容)
但注意:这不支持完整的正则表达式。你不能写 Disallow: /\d+/ 这种规则。
多 User-agent 的策略
实际项目中,你可能想对不同爬虫设置不同规则。比如:
User-agent: Googlebot
Allow: /
Crawl-delay: 1
User-agent: Bingbot
Allow: /
Crawl-delay: 5
User-agent: *
Disallow: /admin/
Disallow: /api/
这里的关键是:爬虫只会匹配第一个符合的 User-agent 块。Googlebot 会匹配第一个块,Bingbot 匹配第二个,其他爬虫匹配第三个 * 块。
所以,把 User-agent: * 放在最后作为兜底规则。
Crawl-delay 的争议
Crawl-delay 用来控制爬虫的访问频率,单位是秒。但这个字段不是标准协议的一部分,不同搜索引擎的处理方式不同:
- Google:完全忽略,通过 Search Console 的"抓取速度"设置控制
- Bing:支持,但最小值是 1 秒
- 百度:支持,但建议不要设置太大(影响收录速度)
- Yandex:完全支持
如果你发现设置了 Crawl-delay: 10 但 Google 还是疯狂抓取,别惊讶——它根本不认这个。
实战:生成 robots.txt 的代码实现
手动写 robots.txt 容易出错,我实现了一个在线生成工具,核心逻辑如下:
interface Rule {
type: 'Allow' | 'Disallow'
path: string
}
interface UserAgentBlock {
userAgent: string
rules: Rule[]
}
function generateRobotsTxt(
blocks: UserAgentBlock[],
crawlDelay?: string,
sitemapUrl?: string,
host?: string
): string {
const lines: string[] = []
for (const block of blocks) {
if (!block.userAgent.trim()) continue
lines.push(`User-agent: ${block.userAgent}`)
for (const rule of block.rules) {
if (!rule.path.trim()) continue
lines.push(`${rule.type}: ${rule.path}`)
}
lines.push('') // 空行分隔不同块
}
if (crawlDelay?.trim()) {
lines.push(`Crawl-delay: ${crawlDelay}`)
}
if (sitemapUrl?.trim()) {
lines.push(`Sitemap: ${sitemapUrl}`)
}
if (host?.trim()) {
lines.push(`Host: ${host}`)
}
return lines.join('\n').trim()
}
使用示例:
const blocks: UserAgentBlock[] = [
{
userAgent: '*',
rules: [
{ type: 'Disallow', path: '/admin/' },
{ type: 'Disallow', path: '/api/' },
{ type: 'Allow', path: '/public/' }
]
},
{
userAgent: 'Googlebot',
rules: [
{ type: 'Allow', path: '/' }
]
}
]
const robotsTxt = generateRobotsTxt(
blocks,
'10',
'https://example.com/sitemap.xml',
'example.com'
)
输出结果:
User-agent: *
Disallow: /admin/
Disallow: /api/
Allow: /public/
User-agent: Googlebot
Allow: /
Crawl-delay: 10
Sitemap: https://example.com/sitemap.xml
Host: example.com
常见框架的 robots.txt 配置
WordPress
User-agent: *
Disallow: /wp-admin/
Disallow: /wp-includes/
Disallow: /wp-content/plugins/
Disallow: /wp-content/themes/
Disallow: /trackback/
Disallow: /xmlrpc.php
Allow: /wp-admin/admin-ajax.php
Allow: /wp-content/uploads/
Crawl-delay: 5
Next.js
User-agent: *
Disallow: /_next/
Disallow: /api/
Allow: /_next/static/
Allow: /api/sitemap
注意:Next.js 的 /_next/ 目录包含编译后的资源,但 /_next/static/ 里的静态资源( CSS 、JS)应该允许抓取,否则搜索引擎无法正确渲染页面。
验证 robots.txt 是否生效
写完不是终点,还得验证。Google Search Console 提供了 robots.txt 测试工具:
- 登录 Search Console
- 选择网站属性
- 左侧菜单找到"robots.txt 测试工具"
- 输入 URL 测试是否被允许抓取
另外,可以用 curl 快速检查:
curl -A "Googlebot" https://example.com/admin/
如果返回 403 Forbidden,说明服务器层面对爬虫做了限制(这是好事)。
robots.txt 的局限性
最后说几个容易忽视的点:
- 不会立即生效:搜索引擎会缓存 robots.txt,更新后可能需要几天甚至几周才能生效
- 不能防止索引:即使禁止抓取,如果其他网站链接到你的页面,搜索引擎仍可能通过链接文字建立索引
- 不安全:robots.txt 是公开文件,任何人都能看到你禁止了哪些路径——别把敏感路径写进去
真正敏感的内容,应该用服务器端的权限控制(如 HTTP Basic Auth、IP 白名单),而不是依赖 robots.txt。
总结
robots.txt 看起来简单,但细节很多:
- 规则匹配基于最长路径,顺序很重要
- 通配符支持有限,不是正则表达式
- Crawl-delay 不是标准,Google 不认
- 多 User-agent 时,爬虫只匹配第一个符合的块
- 验证比编写更重要
如果你不想手写,可以用在线工具:Robots.txt 生成器,支持可视化配置和实时预览。
相关工具:Sitemap 生成器 | Meta Tag 生成器

浙公网安备 33010602011771号