Mihomo / Clash 规则是按顺序匹配的。第一条命中的规则会决定策略,后面的规则不再参与。很多误分流不是规则语法错,而是宽规则放得太早,导致更具体的 DOMAIN-SUFFIX 没机会命中。
三类规则的匹配范围
| 规则 | 匹配方式 | 风险 |
|---|---|---|
DOMAIN,example.com | 完整域名 | 范围最窄,适合特例 |
DOMAIN-SUFFIX,example.com | example.com 及其子域 | 适合常规域名归类 |
DOMAIN-KEYWORD,example | 域名中包含关键词 | 容易误命中无关域名 |
DOMAIN-REGEX,... | 正则匹配 | 灵活但难维护 |
一个可维护的规则集,应该让读者能从上到下看出意图:特例先处理,常规后缀接着处理,模式规则最后兜住无法枚举的情况。
错误顺序示例
rules:
- DOMAIN-KEYWORD,shop,Proxy
- DOMAIN-SUFFIX,internal-shop.example.com,DIRECT
- DOMAIN-SUFFIX,example.com,DIRECT
这里 internal-shop.example.com 会先命中 keyword,后面的 DIRECT 永远不会执行。正确做法是把特例放前面:
rules:
- DOMAIN-SUFFIX,internal-shop.example.com,DIRECT
- DOMAIN-SUFFIX,example.com,DIRECT
- DOMAIN-KEYWORD,shop,Proxy
如果 keyword 只是为了几个固定域名,应该改成 DOMAIN-SUFFIX,而不是继续扩大范围。
regex 只处理后缀规则做不到的事
DOMAIN-REGEX 常被滥用。比如匹配一批带数字的临时域名:
- DOMAIN-REGEX,^api-[0-9]+\.example\.com$,Proxy
这类写法可以接受,因为 suffix 不能表达数字模式。但下面这种就不值得:
- DOMAIN-REGEX,.*example\.com.*,Proxy
它既慢又宽,badexample.com 也可能被纳入。能写成 DOMAIN-SUFFIX,example.com 就不要写 regex。
建立样本表
每次改规则,至少准备这张表:
| 样本域名 | 预期策略 | 预期规则 |
|---|---|---|
example.com | DIRECT | DOMAIN-SUFFIX |
www.example.com | DIRECT | DOMAIN-SUFFIX |
notexample.net | 不应命中 | 无 |
api-12.example.com | Proxy | DOMAIN-REGEX |
shop.internal.example.com | DIRECT | 特例后缀 |
没有样本表,keyword 和 regex 的副作用很难靠肉眼看出来。
调试顺序
- 打开 debug 日志。
- 清理 DNS 缓存或换一个全新测试域名。
- 访问样本域名。
- 查看命中的规则类型和策略名。
- 只调整一条规则,再重复测试。
不要一次移动几十条规则。分流问题需要可复现样本,不是凭感觉拖动规则块。
使用配套订阅线路后,如果订阅自带规则和本地规则同时存在,建议先给本地特例更高优先级,再让订阅规则处理常规域名。
推荐排序模板
rules:
- DOMAIN,one-off.example.com,DIRECT
- DOMAIN-SUFFIX,example.com,DIRECT
- DOMAIN-SUFFIX,example.net,Proxy
- DOMAIN-KEYWORD,only-when-needed,Proxy
- DOMAIN-REGEX,^api-[0-9]+\.example\.org$,Proxy
- MATCH,Final
这个顺序不是唯一答案,但原则固定:越具体越靠前,越宽泛越靠后。维护规则集时,把每条 keyword 和 regex 都当成需要解释的例外,误匹配会少很多。