为什么要用 Rule Provider
直接把几百条 DOMAIN-SUFFIX 平铺在 rules 列表里也能工作,但维护成本很高:规则集作者更新了内容,你必须手动同步;规则条数一多,配置文件也会变得难以阅读。Rule Provider 把这部分内容拆成独立的远程文件,客户端按设定的周期自动重新拉取,规则集本身的维护完全交给上游,你只需要在 rules 里引用它的名字。
三种 behavior,别选错
定义 Rule Provider 时最容易出错的就是 behavior 字段,它告诉客户端应该怎么解析这份规则集的内容:
- domain —— 规则集内容是纯域名列表(每行一个域名,等同于
DOMAIN-SUFFIX语义); - ipcidr —— 规则集内容是 IP 段列表(每行一个 CIDR,等同于
IP-CIDR语义); - classical —— 规则集内容是完整规则(每行自带规则类型,格式与
rules里手写的一致,最灵活但文件体积也最大)。
完整配置示例
rule-providers:
reject:
type: http
behavior: domain
url: "https://example.com/rules/reject.txt"
path: ./rules/reject.txt
interval: 86400
cn-ip:
type: http
behavior: ipcidr
url: "https://example.com/rules/cn-ip.txt"
path: ./rules/cn-ip.txt
interval: 86400
rules:
- RULE-SET,reject,REJECT
- RULE-SET,cn-ip,DIRECT
- MATCH,PROXY
path 是规则集在本地的缓存路径,首次拉取后会写入这个文件,之后按 interval(单位秒)自动重新下载覆盖;即使短暂断网,客户端也能先用本地缓存的旧版本继续工作,不会因为一次更新失败就丢失全部规则。
多个规则集时,顺序怎么安排
规则依然是从上到下逐条匹配、命中即停,这一点不会因为换成 Rule Provider 而改变。实践中比较稳妥的顺序是:
- 先放广告 / 恶意域名拦截类规则集(如
reject),尽早拦掉不必要的请求; - 然后放明确需要代理的规则集(如常见海外服务域名列表);
- 再放国内直连规则集(域名与 IP 段);
- 最后用
MATCH兜底,通常走代理,避免新出现的服务因为没命中任何规则而直接失败。
更新频率怎么定
规则集不需要像节点测速那样频繁刷新,多数场景下 interval 设置在 12~24 小时(43200~86400 秒)之间即可;更新过于频繁只会增加规则集服务器的压力,并不会带来实际收益。如果是自己维护的私有规则集,且改动频率很低,适当拉长到 2~3 天也没有问题。
常见问题排查
接入 Rule Provider 之后,如果发现规则「看起来配了但没生效」,可以按下面几个方向逐一排查:
- 规则集拉取失败 —— 检查
url是否能直接在浏览器打开,部分规则集托管在特定平台上,在某些网络环境下本身就需要走代理才能访问,形成「先有鸡还是先有蛋」的问题,这种情况下建议把规则集换成有国内镜像加速的地址; - behavior 与内容不匹配 —— 前面提到过,这是最常见的失效原因,一份
classical格式的文件如果被声明成domain,客户端会按纯域名格式解析,多出来的规则类型前缀反而会被当成域名的一部分,导致规则集体失效; - 本地缓存过旧 —— 如果怀疑当前用的是很久之前缓存的版本,可以直接删除
path指向的本地文件,客户端下次启动时会重新触发一次完整拉取; - 规则顺序被新规则集打乱 —— 新增一个规则集之后,记得确认它插入的位置是否符合「精确规则在前、兜底规则在后」的原则,插错位置可能会让后面原本正常工作的规则再也匹配不到。
大多数「规则不生效」的问题,最终都能归结到这四类原因之一,按顺序排查一般都能很快定位。想系统了解规则语法的全部类型,可以看进阶配置文档里的完整参考表。
规则配好了,是时候用起来了
下载 Clash 客户端,导入订阅链接,Rule Provider 会在后台自动帮你保持规则集更新。