配置实践 · Clash 技术博客

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

主页面能开却有部分内容失败,在 Connections 找到域名与命中规则。调整具体规则、顺序或 Profile 覆写,验证订阅更新后仍生效;持续更新的大名单用 rule-providers 管理。

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

页面能打开,图片或登录却失败时,要找到失败请求的真实域名,别只给地址栏网址加规则。要让修改生效,还得看规则的位置、使用的策略是否存在,以及订阅更新会不会覆盖它。少量自定义规则可以直接写,需要持续更新的大名单再用规则集管理。

网站只有部分内容失败,规则应匹配哪个域名?

一个页面可能分别请求主域名、登录域名、图片 CDN 和 API。规则匹配的是实际连接中的域名、IP 或进程,地址栏里的网址不一定包含失败的资源。

保持 Rule 模式,在 Connections 找到刚才失败的请求;需要代理时,固定一个确认可用的节点。对照当前策略与期望策略,仅修改这条请求需要的规则,再重新发起请求。期望直连时不需要选择代理节点。

修改规则需要的连接信息

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

规则顺序:具体条件放在宽规则之前

Mihomo 从上到下检查规则,命中第一条就停止。具体条件通常位于更宽规则之前。

下面用 api.example.com 说明规则顺序,这个占位域名不能用于验证真实业务。应用到现有 Profile 时,换成 Connections 记录的真实域名,并使用该配置已有的目标组;组名引用必须完全一致,需要代理时才在组内选中可用节点。期望直连时才使用 DIRECT。

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

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

应用到自己的配置后,保存并重载,关闭修改前的旧连接,再重新请求实际目标。在 Connections 核对真实域名、新命中的规则和最终出口;仍是旧结果时,检查连接复用,以及当前 Profile 是否加载了本次修改。

在 Clash Verge Rev 添加规则,再检查更新后是否保留

直接修改远程订阅文件,下次更新可能覆盖修改。要让自定义规则保留,可以使用客户端的规则覆写功能,在加载订阅时加入自己的规则。

以下步骤以 Clash Verge Rev 为例:右键当前订阅卡片,进入“编辑规则”。添加的规则放在“前置规则”,位于订阅原有的宽规则与 MATCH 之前;其他客户端按自己的文档操作。

让一条自定义规则现在生效,且订阅更新后仍保留

  1. 记录真实请求与目标

    在 Connections 取得失败请求的域名和当前命中规则,确定希望直连还是使用已有策略组。

  2. 确认目标策略可用

    使用当前 Profile 已存在的组名;需要代理时在组内选中可用节点,不能只看到组名便认定走了代理。

  3. 添加一条前置规则

    Clash Verge Rev 中右键当前订阅,打开“编辑规则”并添加一项。按完整域名匹配时,类型选 DOMAIN,填入 Connections 记录的域名,策略选已有组或 DIRECT,位置选“前置规则”。其他客户端按自身文档操作,不覆盖远程订阅缓存。

  4. 重载并发起新请求

    关闭修改前的旧连接,再重复同一动作,读取新命中的规则和最终出口,检查实际失败资源是否恢复。

  5. 更新订阅后再查一次

    手动更新当前订阅,重新请求并核对同一规则、实际出口和页面结果;失败时停用本次新增覆写,保留可用原配置。

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

旧教程的 prepend-rules 与当前规则编辑入口

早期教程可能用 prepend-rules 表示在订阅规则之前加入自己的规则。下面只用于辨认这种写法;当前入口与字段限制见提示。

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

需要持续更新的名单时,再用 rule-providers

只有几条自定义规则时,先通过当前客户端支持的覆写保存,并检查订阅更新后仍有效。需要项目持续维护的大名单时,再用 rule-providers 保存规则数据、用 RULE-SET 引用它;匹配后使用哪个策略,仍由 rules 中的目标决定。

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 与 format:名单内容、格式及组合限制

rule-provider 的 behavior

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

behavior 决定名单内容,format 决定文件格式。yaml、text 和 mrs 不能任意组合:mrs 只支持 domain、ipcidr,不支持 classical。先核对规则源公布的 behavior、format 和实际内容;文件下载成功,不代表组合正确或已经加载。

不要根据 URL 后缀猜格式。规则源改变格式后,客户端仍可能保留旧缓存;按日志中的 provider 名称和解析错误,确认正在加载哪份内容。

规则集下载失败:地址、间隔、代理与缓存

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

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

规则不生效:下载、格式、引用名与顺序

provider download 401 / 403 / 404

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

provider parse error

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

RULE-SET not found

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

proxy group not found

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

规则加载但总命中前一条

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

订阅更新后自定义项消失

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

添加规则后,检查同页其他连接

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

保留新增规则的域名、匹配条件和目标组记录,便于节点或 Profile 改名后检查引用。

参考资料