Mihomo 规则配置怎么写?语法、顺序与可复制示例
简答:Mihomo 的 rules 每行通常按“规则类型,匹配内容,策略名”书写,例如 <code>DOMAIN-SUFFIX,example.com,PROXY</code>。规则会从上到下匹配,第一条命中的规则生效,因此应先写更具体的例外,再写通用规则,最后用 <code>MATCH</code> 兜底。
定义:Mihomo 规则配置,是通过 rules 和可选的 rule-providers,把域名、IP、进程或网络类型匹配到 DIRECT、REJECT 或指定策略组的路由配置。
先试这一步:用最小模板确认规则能工作
如果你刚开始写 Mihomo 规则,不要先复制一整套复杂配置。先备份现有配置,在确认客户端支持的配置入口后,只替换或追加 proxy-groups 与 rules 相关部分。下面的示例假定你已经有一个名为 PROXY 的策略组;如果实际名称不同,必须逐字替换。
| 规则写法 | 匹配对象 | 常见用途 |
|---|---|---|
DOMAIN,example.com,PROXY | 完整域名 | 只匹配一个明确域名 |
DOMAIN-SUFFIX,example.com,PROXY | 域名及其子域名 | 匹配主域名下的多个站点 |
DOMAIN-KEYWORD,example,PROXY | 包含关键词的域名 | 临时测试,需注意误匹配 |
IP-CIDR,192.0.2.0/24,DIRECT,no-resolve | IPv4 网段 | 局域网或已知地址段 |
GEOIP,CN,DIRECT | 目标 IP 的地区库结果 | 按 IP 地区分流 |
MATCH,PROXY | 其余全部请求 | 最后的兜底规则 |
规则格式和可用类型应以 Mihomo 官方路由规则文档为准。策略名不是固定关键字:PROXY、DIRECT 或自定义名称,必须能在当前配置的策略组、代理或出站中找到。
一个可以先验证结构的最小示例是:rules:
- DOMAIN,example.com,PROXY
- DOMAIN-SUFFIX,lan,DIRECT
- IP-CIDR,192.168.0.0/16,DIRECT,no-resolve
- MATCH,DIRECT。这里的域名和网段仅用于演示格式,不代表任何实际服务清单。
Mihomo rules 的基本语法与匹配顺序
大多数基础规则可以理解为三个字段:规则类型、匹配参数、策略名,字段之间用英文逗号分隔。例如 DOMAIN-SUFFIX,example.com,PROXY 中,DOMAIN-SUFFIX 是类型,example.com 是参数,PROXY 是命中后的策略。
Mihomo 按从上到下的顺序检查规则,靠前规则优先级更高;匹配成功后通常不会继续检查后面的规则。官方文档还说明,如果目标 IP 规则需要先解析域名,可以使用默认行为;添加 no-resolve 可以跳过这一步。详情见 官方规则优先级与 no-resolve 说明。
因此,推荐采用“例外在前、范围由窄到宽、MATCH 最后”的顺序:
- 先写必须直连或拒绝的明确域名。
- 再写某个域名后缀、应用类别或规则集。
- 之后写 GEOIP、IP-CIDR 等更宽泛的匹配。
- 最后保留一条
MATCH作为兜底。
反例是先写 GEOIP,CN,DIRECT,后面才写某个需要代理的国内 IP。前面的 GEOIP 已经命中,后面的例外可能不会生效。调整方法是把例外规则移动到 GEOIP 之前,并通过日志或规则命中信息复测。
DOMAIN、DOMAIN-SUFFIX 与 DOMAIN-KEYWORD 怎么选
DOMAIN 用于精确匹配一个完整域名。例如 DOMAIN,api.example.com,PROXY 只针对这个域名。
DOMAIN-SUFFIX 用于匹配主域名及其子域名。官方示例表明,google.com可以匹配 google.com、www.google.com 和 mail.google.com,但不会匹配 content-google.com。因此,需要覆盖一个站点及其子域名时,通常优先考虑该类型。
DOMAIN-KEYWORD 是关键词匹配,只要域名中包含指定文字就可能命中。例如 DOMAIN-KEYWORD,example,PROXY 的范围可能比预期更宽,不建议把它当作长期精确分流规则。排查误匹配时,可先改成 DOMAIN 或 DOMAIN-SUFFIX,再观察实际请求。
如果需求是按 IP 网段匹配,可使用 IP-CIDR 或 IP-CIDR6;如果是按地区匹配,可使用 GEOIP。这些规则依赖当前配置中的解析和地理数据,不能仅凭域名规则推断结果。
用 RULE-SET 和 rule-providers 管理较大的规则集
规则数量较多时,可以把规则放到 rule-provider,再在 rules 中用 RULE-SET 引用。官方配置要求为 provider 指定名称,并根据来源类型配置 type、url 或 path;behavior 可选 domain、ipcidr、classical,format 可选 yaml、text、mrs。具体字段以 Mihomo 官方 Rule Providers 文档为准。
一个不含真实订阅地址的结构示例:
rule-providers:
local-domain:
type: file
behavior: classical
path: ./rules/local-domain.yaml
interval: 86400
rules:
- RULE-SET,local-domain,PROXY
- MATCH,DIRECT
这里的 local-domain 只是本地规则集名称,必须与 RULE-SET 中的名称完全一致。若使用 type: http,还需要核对远程文件实际格式与 behavior 是否对应;不能因为文件名是 yaml 或 mrs,就直接假定其内容一定兼容。
官方规则文档也支持 AND、OR、NOT 等逻辑规则,但括号层级更容易写错。新手建议先用多条普通规则完成验证,只有在确实需要组合域名、网络类型或进程条件时再增加逻辑规则。
配置不生效时:按“校验—命中—策略”排查
- 先备份并校验 YAML。检查是否混用了 Tab 和空格、缩进层级是否一致、冒号后是否缺少空格,以及策略名称中是否包含未正确处理的特殊字符。修改后先让客户端重新加载配置,无法加载时立即回滚到备份。
- 确认当前运行的是 Rule 模式。官方常规配置将
mode: rule定义为按规则匹配;如果当前处于全局或直连模式,rules 可能不会按预期承担分流作用。可参考 Mihomo 官方常规配置说明核对当前模式。 - 检查策略名。
RULE-SET,local-domain,PROXY中的PROXY必须是实际存在的策略组或出站名称。名称大小写、空格和符号都应按当前配置逐字核对。 - 查看规则命中情况。如果客户端提供控制面板或 API,可读取当前规则列表及命中信息。官方 API 文档说明,规则接口会返回规则索引、类型、匹配内容、目标策略,以及可选的命中次数和最近命中时间,详见 Mihomo 官方 API 文档。
- 逐条缩小范围复测。先只保留一条明确的
DOMAIN规则和一条MATCH,确认命中后再恢复后缀、IP、GEOIP 或 RULE-SET。这样可以判断问题来自语法、顺序、DNS 解析,还是规则集内容。
如果订阅更新后自定义规则消失,应先确认客户端使用的是完整配置、覆写配置还是独立配置文件。不要直接修改无法持久化的临时生成文件;应在当前客户端实际保存自定义规则的位置进行修改,并在更新订阅后重新检查。
一份可执行的配置流程
- 确定入口:打开 Mihomo 所在客户端的配置编辑、覆写或本地配置文件入口,先复制一份备份。
- 确认策略:找到
proxy-groups、代理或出站定义,记录准备引用的准确名称,例如PROXY、DIRECT。 - 写最小规则:先加入一条明确的
DOMAIN或DOMAIN-SUFFIX,并把MATCH放在最后。 - 加载配置:保存后重新加载配置,观察是否出现 YAML、规则类型或策略名称错误。
- 验证结果:访问目标域名,查看连接日志或规则命中信息,确认实际策略是否与预期一致。
- 逐步扩展:确认基础规则正常后,再加入
IP-CIDR、GEOIP、GEOSITE或RULE-SET。 - 回滚:如果出现整体无法连接、部分应用异常或规则集加载失败,恢复备份,暂时删除最近新增的规则,再逐条加回。
不同图形客户端的菜单名称和覆写方式可能不同,版本差异也可能导致入口变化;无法确认的菜单路径应以当前客户端界面和 Mihomo 内核文档为准。
常见问题 FAQ
Q1:Mihomo 的 rules 必须放在配置文件最后吗?
不应只按文件位置判断。它需要位于正确的 YAML 顶层结构下,并且规则列表内部要按优先级排序。通常把例外写在前面,把 MATCH 放在规则列表最后。
Q2:为什么写了 DOMAIN-SUFFIX 还是没有命中?
先检查请求的真实域名、策略模式、规则顺序和 DNS 行为,再确认策略名是否存在。若前面的 GEOIP、RULE-SET 或其他宽泛规则已经命中,后面的 DOMAIN-SUFFIX 不会继续生效。
Q3:DOMAIN 和 DOMAIN-KEYWORD 哪个更好?
没有绝对更好。需要精确控制时优先使用 DOMAIN;需要覆盖主域名及子域名时使用 DOMAIN-SUFFIX;DOMAIN-KEYWORD 范围更宽,适合测试或明确知道关键词不会造成误匹配的场景。
Q4:RULE-SET 和 rule-providers 是一回事吗?
不是。rule-providers负责定义规则集来源、格式和更新方式,RULE-SET是在 rules 中引用这个规则集的规则类型,两者的名称必须对应。
Q5:为什么加入 MATCH 后,后面的规则都没有效果?
MATCH会匹配所有未被前面规则处理的请求,因此它应当作为最后的兜底规则。把它提前会截断后续规则的匹配机会。
常见问题
Mihomo 的 rules 必须放在配置文件最后吗?
不需要按文件最后判断,但必须位于正确的 YAML 顶层结构下。规则列表内部应按优先级排序,例外靠前,MATCH 通常放最后。
为什么 DOMAIN-SUFFIX 写了却没有生效?
检查真实请求域名、当前模式、规则顺序和策略名称。若前面的 GEOIP 或 RULE-SET 已经命中,后面的 DOMAIN-SUFFIX 不会继续匹配。
RULE-SET 和 rule-providers 有什么区别?
rule-providers 定义规则集的来源、格式和更新方式;RULE-SET 在 rules 中引用该规则集。引用名称必须与 provider 名称完全一致。
Mihomo 规则配置报 YAML 错误怎么办?
先恢复备份,再检查 Tab、空格、缩进、冒号和特殊字符。确认最小配置可以加载后,再逐段恢复新增规则。