robots.txt 里同一个目录一条允许一条禁止抓取时按哪条走
同一个目录既写了 allow 又写了 disallow,判定顺序在 robots.txt 的协议里是明确的:谁的匹配更具体就按谁走,也就是字节数最多的那条匹配生效。所以「先写的赢」或者「disallow 更严所以赢」都不是规则本身,规则看的是路径长度。
冲突条目按什么顺序判
协议原文的表述是「最具体的匹配必须被采用,最具体的匹配就是匹配上字节数最多的那条」。落到实际写法上,意味着 /admin/list 的规则会盖过 /admin 的规则,无论两条在文件里谁先出现。反过来,如果想让某个子目录在整站被禁的情况下单独放行,正确做法就是给那个子目录写一条更长的 allow,而不是调整行序。
需要留意的是,同一条路径写在同一个分组里时仍然按这条更具体规则处理;但如果两条规则字节数完全相同,协议并没有再给出第三个决胜条件,这种写法应该避开。
路径匹配为什么看字节数
「octet」指的是字节数而不是字符数,这在含中文或非 ASCII 字符的路径上会产生差别:一个汉字在 URL 里通常是三个字节。所以比较两条规则谁更具体时,量的是编码后路径的字节长度。站内如果有中文目录,判定结果可能和按字符数想象的不一致。
分组名与路径的大小写差别
协议对两部分的处理方式不同。分组名(也就是 user-agent 后面的那个标识)必须用大小写不敏感的方式匹配;路径部分则应当按大小写敏感处理。这两条合起来的结果是:写 User-agent: GoogleBot 和 User-agent: googlebot 是一回事,而 /Admin 与 /admin 是两条不同的规则。
还有一类常见误解是把排除文件当命令。协议只定义了四类记录,其余额外条目属于抓取方可以自行解释的范围,不构成对所有抓取方的强制。也就是说排除文件表达的是意愿和约定,不是执行保证。
站内配置怎么避开冲突
多数冲突不是规则写错,而是改写后的路径和 robots 文件里写的路径对不上。伪静态规则把 /article/123.html 这类地址映射到程序内部路径之后,抓取方看到的仍然是改写后的地址,因此 robots.txt 里应该写对外的那一层,而不是内部真实路径。配置时建议固定三条做法:整站基线用一条短规则;需要单独放行的目录用更长的路径写;改动伪静态规则后回到 robots 文件核对目录层级是否还成立。
常见问题
问:Allow 和 Disallow 谁优先? 按协议看具体程度,谁匹配到的字节数多谁生效,不看先后顺序。
问:两条规则长度一样怎么办? 协议没有给出这一层的决胜规则,应当改写其中一条使其更具体,避免依赖各家实现的默认处理。
问:通配符和末尾的美元符号还算字节数吗? 通配符参与匹配,但字节数比较的是匹配上的那条规则,含通配符的规则与不含的规则的相对关系要按协议原文判定,不能靠经验类推。
问:中文目录会不会影响结果? 会。字节数按编码后的路径计算,中文目录的长度普遍比字符数看起来更长,比较具体程度时容易得出与直觉不同的结论。