Mihomo / Clash 规则是按顺序匹配的。第一条命中的规则会决定策略,后面的规则不再参与。很多误分流不是规则语法错,而是宽规则放得太早,导致更具体的 DOMAIN-SUFFIX 没机会命中。

三类规则的匹配范围

规则匹配方式风险
DOMAIN,example.com完整域名范围最窄,适合特例
DOMAIN-SUFFIX,example.comexample.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.comDIRECTDOMAIN-SUFFIX
www.example.comDIRECTDOMAIN-SUFFIX
notexample.net不应命中
api-12.example.comProxyDOMAIN-REGEX
shop.internal.example.comDIRECT特例后缀

没有样本表,keyword 和 regex 的副作用很难靠肉眼看出来。

调试顺序

  1. 打开 debug 日志。
  2. 清理 DNS 缓存或换一个全新测试域名。
  3. 访问样本域名。
  4. 查看命中的规则类型和策略名。
  5. 只调整一条规则,再重复测试。

不要一次移动几十条规则。分流问题需要可复现样本,不是凭感觉拖动规则块。

使用配套订阅线路后,如果订阅自带规则和本地规则同时存在,建议先给本地特例更高优先级,再让订阅规则处理常规域名。

推荐排序模板

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 都当成需要解释的例外,误匹配会少很多。

相关阅读