disallow是全部不允许吗
disallow是全部不允许吗
第一次在 robots.txt 里看到 Disallow: / 的时候,我差点把整个网站从搜索引擎里删干净。不允那会儿刚接手一个客户的全部小站,老板丢过来一句“帮我把后台目录屏蔽一下,不允别让百度收录”,全部我心想这还不简单,不允打开 robots.txt 就写了一行 Disallow: /admin/。全部然后顺手又加了一行 Disallow: /,不允想着“干脆全部不许爬,全部省得漏掉什么敏感路径”。不允
结果第二天老板打电话来,全部语气不太对:“怎么搜我们品牌名,不允连首页都没了?全部”我打开百度一查,好家伙,不允整个站从索引里消失了。全部那行 Disallow: / 不是“除了我指定的,其他都不许”,而是“所有路径,一律不许”。这个语法里根本没有“例外”这一说。
这就是很多人栽跟头的地方。Disallow 指令本身不带任何“允许”的语义。它是一条黑名单规则,你写一条,封一条;你写 /,就是封全部。想开个口子?得靠 Allow 指令去覆盖它。但这里又有个坑:Allow 和 Disallow 同时存在时,匹配规则不是“允许优先”,而是“最长匹配优先”。
举个例子。你写了:
Disallow: /private/
Allow: /private/public/
那么 /private/public/page.html 是允许抓取的,因为 Allow 的路径更长、更具体。但如果你反过来,把 Disallow 写得比 Allow 更细,比如 Disallow: /private/secret/ 配上 Allow: /private/,那 /private/secret/ 下面的东西照样被禁。规则不看谁先谁后,只看谁匹配的字符多。这跟防火墙的 ACL 逻辑有点像,但更简陋——没有优先级权重,没有默认拒绝或默认允许的显式声明。
我还见过一种更隐蔽的误解:有人以为 Disallow: / 只是“不允许爬首页”,子目录会自动放行。完全反了。在 robots.txt 的语境里,/ 代表根路径,而所有 URL 都从根开始。所以 Disallow: / 等于把整棵目录树连根拔起,一个叶子都不留。我后来在日志里翻到,那个客户站被屏蔽的那几天,百度蜘蛛确实来过,但每次请求都被 robots.txt 挡在门外,连 favicon.ico 都没放过。
那有没有“部分允许”的写法?有,但得靠通配符和精确路径的组合。比如你想屏蔽所有 .pdf 文件,但保留 /docs/ 下的 PDF,可以写:
Disallow: /*.pdf$
Allow: /docs/*.pdf$
这里的 $ 表示 URL 结尾,* 匹配任意字符。注意,Allow 的路径必须比 Disallow 更具体,否则不生效。这跟很多人直觉里的“白名单覆盖黑名单”不一样——它更像是“更细的规则赢”。
我自己的习惯是,写完 robots.txt 一定用搜索引擎官方的测试工具跑一遍。Google 的 Search Console 里有 robots.txt 测试器,百度也有类似的站长平台工具。别靠脑子推演,机器读规则的方式跟人脑不一样。有一次我写了个 Disallow: /tmp,以为只屏蔽 /tmp 目录,结果测试发现 /tmpfile.html 也被禁了——因为 /tmp 是前缀匹配,不是目录匹配。想精确匹配目录,得写成 Disallow: /tmp/,末尾那个斜杠不能省。
说到底,Disallow 从来不是“全部不允许”的同义词,但它离“全部不允许”只差一个字符。写 / 就是全禁,写 /admin/ 就是只禁那个目录。它没有“默认允许”的隐含逻辑,也没有“例外自动放行”的温柔。每一条规则都是硬邦邦的字符串匹配。
所以下次你打开 robots.txt,准备敲下 Disallow: / 的时候,先停两秒。问问自己:我是想屏蔽整个站,还是只想屏蔽某个路径?如果答案是后者,那个斜杠后面最好多写几个字母。否则,搜索引擎会非常听话地——什么都不爬。
