配置实践 · Clash 技术博客

Clash 规则怎么写?rule-providers、覆写与订阅更新不丢配置

不要从一份很长的网上规则开始。先在 Connections 找到真正走错的请求,写一条能解释的本地规则;规则变多后再拆成 rule-providers 和覆写。

  • rule-providers
  • mixin
  • YAML
本文目录

规则从一条真正走错的连接开始

规则不是按网站首页标题匹配,而是按实际连接里的域名、IP、进程等信息匹配。一个页面可能同时请求主域名、登录域名、图片 CDN 和 API;只凭地址栏写一条规则,常常只修好页面的一部分。

固定节点并保持 Rule 模式,重复失败动作,到 Connections 记录目标、当前命中的规则和出口。需要改的是“这条连接为什么先命中这里”,而不是把网上整份规则表塞进配置。

动手前留下四项

  • 失败连接的完整域名或目标 IP
  • 当前显示的规则类型与规则内容
  • 最终使用的策略组或 DIRECT
  • 这条连接实际应该去的策略

Mihomo 从上往下匹配,命中第一条就停止

更具体的规则通常放在更宽的规则前面。下面把 api.example.com 交给示例中已经定义的“代理选择”,并让更宽的 example.com 规则保持 DIRECT;末尾的 MATCH 接住此前没有匹配的连接。

自包含示例,具体规则放在宽规则之前
proxy-groups:
  - name: 代理选择
    type: select
    include-all: true
    proxies:
      - DIRECT

rules:
  - DOMAIN,api.example.com,代理选择
  - DOMAIN-SUFFIX,example.com,DIRECT
  - MATCH,代理选择

保存并重载配置后,关闭旧页面连接,再发起新请求。Connections 显示 DOMAIN,api.example.com 和“代理选择”,说明规则与顺序同时生效;仍显示上一条结果时,可能是连接复用或当前 Profile 没有加载这份修改。

同一来源的长名单,才值得交给 rule-providers

只有几条本地域名时,直接规则更容易读。某个项目维护了几十、几百条域名或 IP,且需要定期更新,才用 rule-providers 把数据源与主配置分开。主 rules 中用 RULE-SET 引用 provider,并为整组指定策略。

provider 只是规则数据,不会自己选择节点。示例中的“RULE-SET,work-domains,代理选择”把匹配结果交给已经定义的“代理选择”;如果换成自己的组名,proxy-groups 和 rules 两处必须完全一致。

规则集最小结构,rules.example.com 是待替换地址
proxy-groups:
  - name: 代理选择
    type: select
    include-all: true
    proxies:
      - DIRECT

rule-providers:
  work-domains:
    type: http
    behavior: domain
    format: yaml
    url: https://rules.example.com/work.yaml
    path: ./ruleset/work.yaml
    interval: 86400

rules:
  - RULE-SET,work-domains,代理选择
  - MATCH,代理选择

behavior 要和文件内容一致

rule-provider 的 behavior

文件里放什么不适合放什么
domain域名、域名后缀等域名集合IP 网段与完整经典规则行
ipcidrIPv4 / IPv6 CIDRDOMAIN、PROCESS-NAME 等条件
classical带类型的完整规则,例如 DOMAIN-SUFFIX,...只想维护纯域名时会显得冗长

format 用来说明文件编码形式,常见有 yaml、text 和 mrs。behavior 和 format 是两件事:一个说明规则语义,一个说明文件怎么保存。把纯域名文本声明成 ipcidr,下载可能成功,加载仍会报错。

先查看规则源自己公布的格式说明,不要根据 URL 后缀猜。源文件改变格式时,客户端缓存的旧文件也可能继续存在,日志里的 provider 名称和解析错误能帮助确认。

规则集更新失败,要看 url、interval、proxy 和 path

type
http 从远程更新,file 读取本地文件,inline 把内容直接放在配置中。
url
远程规则源地址;401、403、404 和 timeout 应按 HTTP 结果处理。
interval
更新间隔,单位为秒。过短只会增加请求,并不会让规则更准确。
proxy
指定下载规则源时使用的代理;源站本地可达时也可以按配置直连。
path
缓存文件路径。Mihomo 默认限制在 HomeDir,外部路径需要 SAFE_PATHS。

provider 下载失败时,旧缓存可能仍被使用,所以“网站还能打开”不代表今天更新成功。查看 provider 的本次更新时间与日志,保留旧缓存到新源恢复,不要直接删掉所有规则文件。

远程订阅会被覆盖,自定义规则应放进覆写

直接编辑下载到 Profiles 目录的远程 YAML,当下可能有效,下一次订阅刷新会把它替换。Clash Verge Rev 等客户端提供合并、脚本或规则覆写能力,用来在远程配置加载时插入本地内容;具体入口随版本不同,应使用当前客户端的 Profile 覆写页面。

一条需要优先执行的自定义规则,应通过 prepend 或等效的前置合并放到订阅宽规则之前。只是把它追加到 MATCH 后面,文件里虽然能看到,运行时永远不会到达。

覆写字段示意,只使用内置 DIRECT 动作
prepend-rules:
  - DOMAIN,api.example.com,DIRECT
  - DOMAIN-SUFFIX,intranet.example,DIRECT

重载后看运行时命中,不要只看编辑器里有这行

验证一条覆写规则

  1. 保存并启用覆写

    确认它绑定到正在使用的远程 Profile。

  2. 重载配置

    日志不应出现 rule、provider 或 proxy group 解析错误。

  3. 关闭旧连接

    避免浏览器复用修改前建立的会话。

  4. 重复目标动作

    在 Connections 读取新规则和最终策略。

  5. 手动更新订阅

    更新后再请求一次,确认覆写没有消失。

两次请求都命中同一自定义规则,才证明“当前有效”和“更新后保留”同时成立。只在编辑器里搜索到文字,不能代表它已经进入 Mihomo 的运行配置。

规则不生效时,按下载、解析、引用、顺序四层检查

provider download 401 / 403 / 404

处理远程地址、权限或已迁移路径,规则语法还未参与。

provider parse error

核对 behavior、format 与源文件实际内容。

RULE-SET not found

rules 引用名与 rule-providers 键名不一致。

proxy group not found

规则目标组在当前订阅中不存在或已经改名。

规则加载但总命中前一条

调整顺序,让具体规则位于宽规则和 MATCH 之前。

订阅更新后自定义项消失

停止直接改远程文件,改用绑定当前 Profile 的覆写。

每条新增规则都要能解释运行结果

规则越多,互相遮挡的机会越大。完成目标域名的验证后,检查同一页面的其他连接是否仍按预期直连或代理;若只需要三条规则,就不必引入一个包含数万条未知来源的列表。

收尾时用一句话说明运行结果:哪条连接命中了哪个条件,进入哪个策略组,订阅更新后仍然如此。解释不了的规则暂时不加,日后节点和 Profile 改名时也更容易维护。

参考资料