如果你想让"所有国内网站"或者"所有常见广告域名"都统一走某条规则,手动写几十条 DOMAIN-SUFFIX 显然不现实,而且社区里已经有人维护好了这类规则集并持续更新。Rule Provider 就是让你的配置文件"引用"这些远程规则集的机制,本地只需要写一行引用,规则内容由远程文件自动更新。
01基本写法
Rule Provider 分两步:先在 rule-providers 里声明规则集来源,再在 rules 里用 RULE-SET 引用它。
rule-providers:
reject:
type: http
behavior: domain
url: "https://example.com/rules/reject.txt"
path: ./ruleset/reject.yaml
interval: 86400
rules:
- RULE-SET,reject,REJECT
- GEOIP,CN,DIRECT
- MATCH,PROXY02behavior 字段的三种类型
behavior 决定了这个规则集里的内容该怎么被解析,写错会导致规则集完全不生效,是最容易出错的一个字段。
| behavior | 规则集内容格式 | 典型用途 |
|---|---|---|
| domain | 纯域名列表,每行一个域名或域名后缀 | 广告域名黑名单、特定网站分流列表 |
| ipcidr | 纯 IP 段列表,每行一个 CIDR | 国内 IP 段、特定云服务商 IP 段 |
| classical | 完整的规则语句(不含最终策略),如 DOMAIN-SUFFIX,x.com | 规则类型混合、更灵活的自定义规则集 |
type 字段:http 还是 file
type: http 表示从远程 URL 定期拉取更新,是最常见的用法;type: file 则表示直接使用本地已有的规则集文件,适合你自己维护、不需要联网更新的场景。
03常见的规则集来源
社区里比较知名的规则集项目包括基于域名分类整理的 GeoSite 系列、以及各类"ACL4SSR"风格的规则合集,它们通常会同时提供 domain 和 classical 两种格式的文件,具体链接可以在对应项目的官方仓库中找到,使用时注意核对 behavior 是否与你选用的文件格式一致。
04为什么规则集不生效
- behavior 和文件格式不匹配:比如远程文件其实是纯域名列表,却写成了 behavior: classical,内核解析会直接报错或忽略该规则集。
- path 指向的本地缓存过期:如果修改了 url 但本地已经缓存过一份旧文件,有些客户端不会自动覆盖,需要手动删除 path 对应的本地文件后重新拉取。
- interval 设置过长:更新间隔(单位:秒)设置得太长会导致规则集长期停留在旧版本,日常使用建议设置为 43200~86400(12~24 小时)。
05Rule Provider 和普通规则可以混用吗
可以,而且这是最常见的用法。rules 列表里 RULE-SET 引用和普通规则(如 DOMAIN-SUFFIX、GEOIP)完全可以混合书写,内核依然按照"从上到下逐条匹配,命中即停止"的顺序处理,不会因为规则来源不同而区别对待。实际配置中,通常会把几个常用的规则集(比如广告拦截、国内网站直连)放在前面,中间穿插一些你自己手写的特殊域名规则,最后用一条兜底规则收尾,两种写法搭配使用反而是更省心的做法。
06自己维护规则集文件是否有必要
对绝大多数普通用户来说,没有必要。社区维护的规则集已经覆盖了广告拦截、国内外网站分类等主流需求,且有持续更新维护,直接引用即可。只有当你有非常特殊的分流需求(比如公司内部域名、自己长期维护的特定网站列表)且这些内容不适合公开分享时,才值得考虑用 type: file 搭配本地文件自己维护一份规则集,平时正常使用手写几条规则或者用 rules 里的普通规则完全够用。