本文目录
规则从一条真正走错的连接开始
规则不是按网站首页标题匹配,而是按实际连接里的域名、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 两处必须完全一致。
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 网段与完整经典规则行 |
| ipcidr | IPv4 / IPv6 CIDR | DOMAIN、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 后面,文件里虽然能看到,运行时永远不会到达。
prepend-rules:
- DOMAIN,api.example.com,DIRECT
- DOMAIN-SUFFIX,intranet.example,DIRECT重载后看运行时命中,不要只看编辑器里有这行
验证一条覆写规则
保存并启用覆写
确认它绑定到正在使用的远程 Profile。
重载配置
日志不应出现 rule、provider 或 proxy group 解析错误。
关闭旧连接
避免浏览器复用修改前建立的会话。
重复目标动作
在 Connections 读取新规则和最终策略。
手动更新订阅
更新后再请求一次,确认覆写没有消失。
两次请求都命中同一自定义规则,才证明“当前有效”和“更新后保留”同时成立。只在编辑器里搜索到文字,不能代表它已经进入 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 改名时也更容易维护。
