Mihomo 规则组不生效怎么办?按 5 层快速排查
简答:Mihomo 规则组不生效时,先不要急着重写配置:确认当前是 rule 模式、目标流量确实进入 Mihomo,再在连接详情中查看实际命中的规则和最终策略组。之后按规则顺序、组名引用、规则集状态、旧连接复用依次排查,通常可以定位到具体层级。
定义:Mihomo 规则组不生效,通常是指规则没有命中、命中后引用的策略组不可用,或目标流量根本没有进入 Mihomo 内核。
先做 5 分钟判断:到底是哪一层出了问题
本文是第三方使用指南,按 2026-10-28 检索到的 Mihomo 文档整理;不同客户端的菜单名称可能不同,最终以当前客户端和内核版本为准。Mihomo 的规则按配置中的顺序从上到下匹配,越靠前优先级越高;MATCH 会匹配所有请求,因此通常应放在规则末尾,而不是放在自定义前置规则的开头。详情可查看Mihomo 路由规则文档。
| 现象 | 优先检查 | 判断方法 |
|---|---|---|
| 所有请求都走同一个组 | 运行模式、规则顺序、提前出现的 MATCH | 确认不是 global 或 direct,并查看连接的 rule 与 rulePayload |
| 规则显示已命中,但组内节点不对 | proxy-groups 的 name、type、成员和当前选择 | 检查规则末尾的目标名称是否与组名完全一致 |
| 规则集没有效果 | rule-providers 下载、behavior、format 和引用名称 | 查看规则提供者状态及本地缓存是否更新 |
| 改完配置仍走旧策略 | 配置是否重载、旧连接是否复用、DNS 或假 IP 缓存 | 关闭旧连接后重新访问,并在必要时刷新对应缓存 |
| 浏览器有效、某个应用无效 | 系统代理、TUN、应用自带代理或 VPN 冲突 | 确认该应用的流量是否真的进入 Mihomo |
先试这一步:将客户端临时切到 rule 模式,打开连接详情,访问一个明确的测试域名,记录 rule、rulePayload 和 chains。如果连接列表里没有这条请求,先排查流量接入,不要继续修改规则。
第一层:确认 Mihomo 正在按规则工作
- 确认运行模式。配置中的
mode应为rule。Mihomo 文档列出的模式包括rule、global和direct,默认模式为rule,但客户端界面可能覆盖配置文件设置。可参考Mihomo 通用配置文档。 - 确认流量入口。普通系统代理只能接收遵循系统代理设置的应用;TUN、应用自带代理、其他 VPN 或网络过滤工具可能改变流量路径。假如浏览器请求能在 Mihomo 的连接列表看到,而某个应用完全没有记录,问题更可能在系统代理、TUN 路由或应用自身代理设置,而不是规则内容。
- 检查实际生效配置。不要只看订阅原文或本地模板。客户端可能通过订阅覆写、配置合并或启动参数生成另一份运行配置。若启用了外部控制接口,可以通过
/configs查看当前运行配置,通过/version查看内核版本;相关接口说明见Mihomo API 文档。 - 用新请求验证。修改模式或配置后,先重载,再关闭旧连接,最后重新打开目标页面。已有连接可能继续沿用原来的连接链路,不能用“旧页面还没变化”直接证明新规则无效。
第二层:检查规则顺序、匹配范围和兜底规则
Mihomo 规则不是同时竞争,而是按顺序逐条判断。具体规则应放在宽泛规则前面,MATCH 应作为兜底放在最后。下面是一个最小诊断片段,只用于核对规则写法和顺序,不是完整可运行配置:
DOMAIN,example.com,办公组:匹配完整域名。DOMAIN-SUFFIX,example.com,办公组:匹配该域名及其子域名,但不匹配仅包含相同文字的其他域名。DOMAIN-KEYWORD,example,办公组:按域名关键词匹配,范围更宽,误命中风险也更高。RULE-SET,work_domains,办公组:调用名为work_domains的规则提供者。MATCH,默认组:匹配所有尚未被前面规则处理的请求,应放在末尾。
例如,若前面已经有一个宽泛的 DOMAIN-KEYWORD,example,后面的精确 DOMAIN,api.example.com 就可能没有机会命中。排查时可以暂时只保留一条明确的 DOMAIN 规则和最后一条 MATCH,然后重新发起请求。
注意:如果你使用订阅覆写的前置规则,不要在前置规则模板末尾添加 MATCH,你的原代理策略组。这样会让兜底规则排在订阅原有规则之前,导致后面的分流规则失去机会。前置规则应只放需要提前匹配的具体规则,兜底规则应保留在最终规则列表末尾。
第三层:核对策略组名称和组内成员
规则右侧写的是策略组名称,不是随意的显示文字。例如规则写成 DOMAIN,example.com,办公组,就必须在 proxy-groups 中存在名称完全相同的 办公组。空格、大小写、标点和全角半角差异都可能导致引用失败。
- 在最终配置中搜索规则目标名称。
- 在
proxy-groups中搜索同名name。 - 检查该组的
type是否存在且写法正确。 - 检查
proxies或use是否真的提供成员。 - 打开策略组详情,确认组内不是空列表,也不是所有成员都不可用。
Mihomo 官方文档说明,策略组的 name 是必填项,proxies 可引用出站代理或其他策略组,use 可引用代理集合;这些字段不能混为一谈。可对照Mihomo 策略组配置文档。
还要区分策略组类型:select 需要检查当前手动选择;url-test 会依据健康检查结果选择成员;fallback 会在当前节点超时时按顺序选择可用节点。节点延迟测试通过,只能说明测试地址在当时可访问,不能单独证明目标业务网站、DNS、TLS 和完整分流都正常。
第四层:排查 RULE-SET 规则集没有加载
如果普通 DOMAIN 规则能命中,而 RULE-SET 没有效果,优先检查 rule-providers。官方文档要求 HTTP 类型提供 url,规则提供者名称必须唯一;behavior 要与规则内容类型匹配,例如 domain、ipcidr 或 classical,格式还可能是 yaml、text 或 mrs。具体字段以Mihomo rule-provider 文档为准。
- 确认
rules中引用的提供者名称与rule-providers下的键完全一致。 - 确认 URL 可被当前网络访问,且没有被 DNS、代理或证书错误阻断。
- 确认
behavior与远端文件内容匹配,不能把纯域名列表当成 classical 规则。 - 在面板或 API 的规则提供者页面查看更新时间、状态和规则数量。
- 更新提供者后重新加载配置,再关闭旧连接重新访问。
如果日志出现 provider 下载失败、解析失败、找不到提供者或规则为空,不要先修改策略组;先恢复规则集的下载和解析。若规则集来源不稳定,可以先用一条明确的本地 DOMAIN 规则验证策略组链路,再单独处理 provider。
第五层:用日志和连接详情确认最终结果
只看“规则配置页面”不够,真正有用的是一次新连接的实际记录。Mihomo API 的连接对象包含目标元数据、代理链、匹配到的 rule 和 rulePayload;日志接口也支持获取实时日志并设置 debug 级别。可参考官方 API 接口说明。
- 没有连接记录:优先排查系统代理、TUN、应用自带代理、VPN 冲突或应用绕过设置。
- 有连接记录但 rule 不符合预期:检查规则顺序、域名实际解析结果和匹配类型。
- rule 正确但 rulePayload 指向错误组:检查规则右侧目标名称和订阅覆写。
- 规则和组都正确但连接失败:检查组内节点、协议、DNS、TLS 和目标站点,不要把规则命中等同于连接成功。
- 修改后仍显示旧结果:关闭该连接,必要时使用 API 的连接删除接口清理旧连接;涉及 DNS 或 fake IP 时,再按实际配置刷新对应缓存。
完成验证后,把日志级别恢复为原来的设置,并撤销临时关闭 TUN、停用 DNS 或切换直连等高风险测试动作,避免留下与日常使用不一致的状态。
一份可照做的恢复顺序
- 备份当前配置或导出订阅覆写内容。
- 确认客户端当前使用的是 Mihomo 内核,并记录内核版本。
- 切换到
rule模式,确认目标请求能出现在连接列表。 - 用一条明确的
DOMAIN规则测试,不要一开始就调复杂规则集。 - 检查规则目标名称与策略组
name是否完全一致。 - 确认策略组不是空组,手动选择组先使用一个可识别的成员。
- 将宽泛规则和
MATCH移到具体规则之后。 - 单独检查 rule-provider 的下载、缓存、behavior 和 format。
- 重载配置,关闭旧连接,重新访问测试域名。
- 确认恢复正常后,再逐项恢复自动选择、TUN、DNS 优化和复杂规则集。
这套顺序的目的,是把“流量没进内核”“规则没命中”“组名不可用”“规则集没加载”“旧连接未更新”分开验证,避免一次改动多个变量后无法判断到底是哪一步起作用。
常见问题
Mihomo 规则组不生效,最常见的原因是什么?
最常见的排查方向有五类:当前不是 rule 模式、目标流量没有进入 Mihomo、前面的宽泛规则或 MATCH 抢先命中、规则目标名称与策略组 name 不一致、rule-provider 没有成功加载。建议按流量接入、规则匹配、策略组、规则集、旧连接的顺序检查。
规则已经命中,为什么实际节点还是不对?
规则命中只说明某条规则被选中,还要检查该规则右侧的策略组名称、组内成员和当前选择。select 组要看手动选择,url-test 或 fallback 组还会根据健康检查和可用性改变最终成员。
前置规则里可以放 MATCH 吗?
通常不应放。Mihomo 按从上到下的顺序匹配,前置规则中的 MATCH 会提前匹配所有请求,可能让订阅原有分流规则全部失效。前置规则只放需要提前处理的具体规则,兜底 MATCH 保留在最终规则列表末尾。
RULE-SET 和普通 DOMAIN 规则有什么区别?
DOMAIN 是直接写在 rules 中的单条匹配规则;RULE-SET 会引用 rule-provider 提供的一组规则。RULE-SET 额外依赖提供者名称、下载状态、缓存文件、behavior 和 format,任何一项不匹配都可能导致规则集看似配置了但没有效果。
改完规则后需要重启客户端吗?
不一定。优先使用客户端提供的重载配置功能;如果客户端没有可靠的重载入口,再按其文档重启。无论采用哪种方式,都应关闭旧连接并重新发起请求,因为旧连接可能仍沿用修改前的代理链路。