抓取方挑规则组时不看大小写,路径规则却看,配置时会踩哪一处
抓取方挑规则组时不看大小写,路径规则却看,配置时会踩哪一处?踩在路径上。RFC 9309 里,产品标识的匹配是强制不区分大小写(Crawlers MUST use case-insensitive matching to find the group that matches the product token),而路径匹配写明 The matching SHOULD be case sensitive。结果是:写 User-agent 时大小写随意,写路径时 /Upload/ 和 /upload/ 是两条不同规则,挡下一个不代表挡下另一个。
协议只认两条指令
语法定义只有一条:rule = *WS (“allow” / “disallow”) *WS “:” *WS (path-pattern / empty-pattern) EOL。也就是说协议层面上的指令只有 allow 与 disallow,取值是路径模式或空模式。除此之外的任何行,都不在这份语法的约束里。
挑组看标识,命中看路径
规则是按产品标识分组的:抓取方先用自己的标识去匹配各个 User-agent 组,这一步不区分大小写,Googlebot 与 googlebot 属于同一组。选定组之后才开始比路径,路径匹配 SHOULD 区分大小写,因为服务器上的文件名本身往往区分。这两步用不同的大小写策略,是协议设计而非实现随意,配置时按各自的规则走。
冲突时谁赢:按字节数取最具体
同一组里 allow 与 disallow 都能匹配上同一个路径时,判定标准是 The most specific match is the match that has the most octets,即匹配到的字节数最多者胜出。注意单位是 octet(字节)而不是字符:非 ASCII 目录在常见编码下每个字符占多个字节,中文路径看起来短、字节数却更长,容易和”写得越长越具体”的直觉错位。判断冲突结果时按编码后的字节长度想,而不是按屏幕上数了几个字。
协议之外还写着什么
协议对额外记录留了口子:Crawlers MAY interpret other records that are not part of the robots.txt protocol – for example, “Sitemaps”。这句话有两层含义。一是站点地图记录确实常被写在同一份文件里,但它的解释依各家实现,不是协议规定的义务。二是像 noindex、抓取间隔这类扩展指令同样落在”可解释可不解释”的范围内,跨引擎效果不一致属正常,需要屏蔽时应以路径规则为准,别把关键控制押在扩展行上。
站内怎么对齐这套规则
Robots.txt 配置在后台集中管理时,要按协议的两套大小写策略写:屏蔽路径逐条区分大小写列全,实际目录叫什么就写什么。更常见的冲突来源是 URL 形态本身——AnQiCMS 支持自定义伪静态规则的伪静态 URL,规则改过一次就要回头核对抓取文件里的路径是否还指向同一形态,否则会出现”规则写的是旧路径、线上已换成新路径”的空挡。站点地图里的地址与抓取规则里的路径要同源:Sitemap 自动生成的地址若大小写与线上实际访问路径不同,地图可访问但内容被规则挡住,这类问题在日志里表现为抓取记录正常、收录却掉。
常见问题
问:只写一条 disallow 大小写不同的目录行吗? 答:分开写。路径匹配区分大小写,两条写法命中的是不同资源,写一条等于漏一条。
问:冲突时是不是 disallow 优先? 答:不是。协议按最具体匹配判定,比较的是匹配到的字节数,与指令是 allow 还是 disallow 无关。
问:站点地图一定要写在抓取文件里吗? 答:不是强制项。它属于协议之外的常见扩展解释,稳妥做法是同时在地图提交入口登记,不只依赖这一行。