当订阅配置里的规则越来越多,直接把每条 DOMAIN、DOMAIN-SUFFIX 都堆进主 YAML,短期看起来很快,几个月后却容易变成难以审查的长清单:重复规则不知道删哪条,服务域名更新要逐个客户端修改,换订阅时自定义规则还可能被覆盖。rule-providers 的作用,就是把规则内容与主配置分开维护,再通过规则引用把一组规则统一交给指定策略组。本文从加载机制、规则集文件格式、GitHub 托管、定时更新和版本管理几个环节,带你把零散条目整理为可复用、可回滚的配置工程。示例适用于支持相应规则提供者语法的 Clash / Mihomo 内核;不同客户端的配置覆写入口和内核版本可能有差异,实际使用前请先确认当前内核支持相关字段。
rule-providers 的职责:规则内容与分流策略分开
可以把一条分流规则拆成两部分理解:规则集回答「哪些请求属于这一组」,主配置中的策略则回答「命中后交给谁处理」。例如,你可以把常用开发平台域名放进名为 dev-sites 的规则集,再用 RULE-SET,dev-sites,PROXY 将命中的请求交给代理策略组。以后新增或删除开发域名,只改规则文件,不必把整组条目复制到多份配置里。
rule-providers 是主配置里的声明区。每个 provider 都有一个唯一名称、来源类型、匹配行为和文件位置或远程地址;规则列表通过 rules 中的 RULE-SET 引用。要特别注意,provider 名称与策略组名称不是一回事:前者指规则集合,后者指流量出口。名称拼写不一致、规则集声明了却没有被引用,都会让结果与预期不同。
规则行为应与文件内容相匹配。常见的 domain 用于域名类规则,ipcidr 用于 IP 网段,classical 则可容纳传统规则写法,例如 DOMAIN-SUFFIX、PROCESS-NAME 或带策略参数的规则。支持的规则类型与格式取决于内核;不要因为文件扩展名是 .yaml 就假定内容一定会被识别,必须同时核对 provider 的 behavior 与 format。
先从本地 YAML 规则集开始
首次编写时建议先用本地文件验证,减少网络托管、URL 拼写和缓存带来的变量。下面的例子把规则集放在配置目录下的 rules 文件夹中。path 是内核保存或读取 provider 数据的位置;不同客户端的工作目录与文件权限管理方式不完全相同,因此文件放置位置要以客户端实际配置目录为准。
rule-providers:
dev-sites:
type: file
behavior: domain
format: yaml
path: ./rules/dev-sites.yaml
rules:
- RULE-SET,dev-sites,PROXY
- MATCH,DIRECT
对应的 rules/dev-sites.yaml 可以写成:
payload:
- DOMAIN-SUFFIX,github.com
- DOMAIN-SUFFIX,githubusercontent.com
- DOMAIN,registry.npmjs.org
- DOMAIN-SUFFIX,pypi.org
这里使用的是 YAML 规则集格式,外层以 payload 承载规则条目。若选用文本格式,规则文件通常按支持的格式逐行列出规则,并在 provider 中声明相符的 format;不要把带有 payload: 的 YAML 文件误标成纯文本。规则集只负责匹配目标,不会自动创建名为 PROXY 的策略组,也不会替你决定该组中的节点。主配置必须已经存在对应策略组,否则仍需先修正策略引用。
规则顺序也很重要。大多数规则引擎按主配置中的规则顺序匹配,命中后不再继续寻找更靠后的普通规则。因此,范围较窄、目的明确的自定义规则通常应放在更宽泛的通用规则之前;而最终兜底规则如 MATCH,DIRECT 应留在末尾。若把过宽的规则集放到前面,后续更精确的直连规则可能永远没有机会生效。
托管到 GitHub:明确分支、路径与更新方式
本地测试通过后,可以把规则文件放进自己维护的 GitHub 仓库。建议按用途划分目录,例如把开发站点、流媒体或自定义直连规则分别存为独立文件;文件名尽量表达用途,避免使用 rules-final-new2.yaml 这类无法判断内容的名称。公开仓库可通过原始文件地址供内核获取,配置中填写的 URL 应指向文件本身,而不是 GitHub 的代码浏览页面。
rule-providers:
dev-sites:
type: http
behavior: domain
format: yaml
url: https://raw.githubusercontent.com/你的账号/你的仓库/main/rules/dev-sites.yaml
path: ./rules/dev-sites.yaml
interval: 86400
type: http 表示由内核从远程地址拉取规则;interval 是更新检查间隔,单位为秒,示例中的数值表示大约每天检查一次。远程 provider 通常也需要本地 path 作为缓存文件位置。首次启动时若无法访问远程地址,缓存可能尚未生成,相关规则就不能按预期加载;因此要验证设备启动时的网络可达性,并确认配置目录可写。某些客户端会管理订阅配置或限制可编辑目录,遇到路径失效时,应在客户端支持的覆写机制中配置,而不是随意改动应用内部文件。
GitHub 仓库设置为公开时,任何人都可能读取规则文件,因此不要把订阅链接、账号令牌、内网域名清单或其他敏感数据放进仓库。若仓库是私有的,普通原始文件 URL 通常不能直接匿名访问;在确认内核支持所需认证方式之前,不要把个人访问令牌硬编码进可分享的 YAML。规则文件内容本身一般不需要秘密信息,公开托管时仍应检查提交历史中是否意外包含敏感内容。
更新频率应按规则变化速度设置。每天变化很少的个人规则集,较长间隔往往更合适;短时间频繁改动的测试集则可以暂时缩短间隔。过于频繁地请求远端并不会让规则匹配更准确,还可能增加仓库请求量,并在网络不稳定时造成反复更新失败。更新生效后,通过客户端的规则提供者状态或连接日志确认加载时间和规则版本,不要只根据 GitHub 页面已更新就断定每个客户端都拿到了新文件。
定时更新、版本管理与回滚实践
interval 负责让内核周期性检查远端资源,但它不等于完整的发布流程。更稳妥的维护方式是把规则修改视为一次配置变更:提交前检查 YAML 缩进、字段和重复项;提交后记录改动原因;确认线上规则集能被客户端正常下载,再观察是否有域名误分流。个人使用可以在 GitHub 仓库里通过提交历史查看每次差异;多人协作则应要求变更说明清楚写明新增域名、适用场景以及预期策略。
建议为主配置保留一个已知可用的版本,同时让规则集的修改可以独立回退。发现更新后某个常用站点命中错误时,先在 GitHub 历史中定位最近一次改动,确认是否由新增的宽泛后缀或错误的域名条目造成;必要时恢复上一版规则文件,再让客户端重新更新。不要一边改 provider、一边改策略组、一边更换节点,这样即使问题消失,也很难知道真正有效的是哪项改动。
自动化检查可以逐步增加,而不必一开始就搭建复杂流水线。最基本的检查是确保规则文件可解析、格式与声明一致、每条规则符合预期行为;更进一步,可以在提交时检查重复域名、空文件和明显的占位符。若使用自动发布工具,令其只处理规则目录,并在提交中保留清晰的变更记录。避免让自动任务覆盖主配置或其他目录,尤其不要把个人订阅配置混入公共仓库。
多设备共用同一规则集时,仍要考虑内核版本差异。桌面端与移动端可能使用不同版本的 Clash / Mihomo 核心,对字段、格式或特定规则类型的支持并非总是一致。可以先选一台测试设备加载更新,确认 provider 状态正常,再推广到其他设备;如果某端不支持某种规则行为,可为该端维护兼容版本,或把不兼容条目拆分到另一个规则集。不要仅凭客户端界面显示「配置已更新」就推断所有规则都已正确参与匹配。
常见排障路径与规则集设计原则
出现规则不生效时,按由外到内的顺序检查,通常比反复重启更快。第一步确认 provider 是否成功加载:远程 URL 是否可访问、文件是否返回实际 YAML 而非网页错误内容、本地缓存路径是否可写。第二步核对 behavior、format 与文件结构是否一致。第三步检查 rules 是否用正确名称引用 provider,策略组名称是否存在。最后再查看匹配顺序和客户端连接记录,确认请求实际使用的主机名是否落在规则集范围内。
- 提示找不到规则提供者:核对 provider 名称大小写、连字符和
RULE-SET引用是否完全一致,并确认声明位于主配置正确层级。 - 远程加载失败:在设备所在网络中检查原始文件 URL,确认没有仓库路径拼写错误、分支名称错误或访问限制;同时查看内核日志中的下载状态,而非只看浏览器能否打开仓库首页。
- 配置能启动但规则不命中:检查文件格式、匹配行为、目标域名形式与规则优先级。浏览器可能访问了子域名或不同的 API 主机,单看首页域名不一定足够。
- 规则命中却选错出口:provider 只提供匹配条件,策略由
RULE-SET后面的策略组决定;检查该组当前选择、组内节点状态以及是否有更早规则抢先命中。 - 更新后个别客户端表现不同:比较内核版本、规则提供者状态和缓存时间,逐台确认支持能力,不要假设所有客户端共享同一份本地缓存。
设计规则集时,优先按维护责任或使用场景拆分,而不是把所有条目都塞进一个巨型文件。例如,团队可将公司内网规则与个人开发工具规则分开;家庭配置则可把特定应用的域名规则与通用直连规则分开。规则集数量也不宜无限增加:拆分可以提升审查与回滚效率,但每个 provider 都带来下载、缓存和排错成本。选择能让你清楚回答「这组规则由谁维护、命中后去哪里、怎样恢复」的粒度即可。
与完全依赖客户端界面逐条添加相比,rule-providers 更适合需要跨设备复用、集中审阅和留存变更记录的场景;而一些简单客户端或静态配置方式,可能更容易上手,却不一定提供方便的远程更新与版本回滚能力。把规则文件托管在自己可控的仓库中,再配合明确的策略组、加载验证和提交历史,能让分流配置更透明,也更容易定位问题。如果你正在整理 Clash 配置,可以先从一个小型规则集开始,再按实际命中情况逐步扩展。需要选择合适的客户端与相关工具时,可从下载页了解各平台选项。