rules 最后为什么一定要写 MATCH,不写会怎样
MATCH 是 Clash 规则列表的兜底项,决定没有命中任何规则的流量走哪里。不写它不一定报错,但会导致「大部分网站正常、个别网站莫名其妙不走代理」这类难查的问题。本文说明它的作用、白名单与黑名单两种写法,以及规则顺序为什么重要。
本文目录(7 节 · 约 2 分钟) +
- 01 规则是从上往下逐条匹配的
- 02 不写 MATCH 会发生什么
- 03 两种写法对应两种思路
- 04 FINAL 和 MATCH 是一回事吗
- 05 顺带说规则顺序的另外两个坑
- 06 检查你的规则
- 07 小结
一句话结论:MATCH 匹配所有前面没命中的流量,是规则列表的最后一道兜底。 不写它,未命中的流量走什么策略取决于客户端的默认行为,而不同客户端的默认值不一样——这就是「同一份配置在两个客户端上表现不同」的常见来源。
规则是从上往下逐条匹配的
Clash 的 rules 是有序列表,一条流量进来后从第一条开始比对,命中第一条就停止,不再往下看。
rules:
- DOMAIN-SUFFIX,google.com,节点选择
- DOMAIN-SUFFIX,github.com,节点选择
- GEOIP,CN,DIRECT
- MATCH,节点选择
访问 google.com 时命中第一条,走「节点选择」;访问一个国内 IP 时前两条不匹配、第三条命中,直连;访问一个既不在前三条范围内的地址时,前三条都不命中,落到 MATCH 上。
MATCH 的匹配条件是「什么都匹配」,所以它必须放在最后。放在中间的话,它后面的所有规则永远不会被执行到——这是个静默的错误,配置能跑,但一部分规则形同虚设。
不写 MATCH 会发生什么
不一定报错。多数客户端会用一个内置默认值兜底,但这个默认值:
- 各客户端不一致(有的默认直连,有的默认走全局策略)
- 同一客户端的不同版本也可能变
- 通常不会在界面上明示
结果就是一类很难查的问题:大部分网站正常,某几个网站行为诡异。因为常用网站都被前面的规则覆盖了,只有那些没被任何规则命中的冷门域名,才会掉进这个不确定的兜底里。
更麻烦的是这类问题往往不稳定复现——换个网络环境、换个客户端版本,表现就变了。
两种写法对应两种思路
白名单模式:默认走代理
rules:
- GEOIP,CN,DIRECT
- DOMAIN-SUFFIX,cn,DIRECT
- MATCH,节点选择
意思是「国内的直连,其余全部走代理」。适合主要用途是访问境外服务的人。缺点是国内一些用了境外 CDN 的服务可能被误判走代理,反而变慢。
黑名单模式:默认直连
rules:
- DOMAIN-SUFFIX,google.com,节点选择
- DOMAIN-SUFFIX,youtube.com,节点选择
- MATCH,DIRECT
意思是「只有列出来的走代理,其余全部直连」。适合只想让特定几个服务走代理的人,对国内访问零影响。缺点是要自己维护清单,漏了的网站就不走代理。
机场提供的订阅配置绝大多数是白名单模式,因为对普通用户来说「能上就行」比「精确控制」重要。
FINAL 和 MATCH 是一回事吗
在 Clash 系配置里,FINAL 是 MATCH 的旧写法,作用相同。新配置一律用 MATCH,FINAL 只在很老的配置里还能见到。如果你的配置里两个都有,那是拼接配置时留下的重复兜底——后面那条永远不会执行。
顺带说规则顺序的另外两个坑
一、把宽泛的规则放在了具体规则前面
rules:
- GEOIP,CN,DIRECT
- DOMAIN-SUFFIX,example.cn,节点选择 # ← 永远不会命中
- MATCH,节点选择
如果 example.cn 解析到国内 IP,第一条 GEOIP,CN 就把它拦下直连了,第二条根本轮不到。规则要按「从具体到宽泛」排列。
二、GEOIP 规则会触发 DNS 解析
GEOIP 判断的是 IP 归属地,而请求里给的往往是域名,所以客户端必须先把域名解析成 IP 才能判断。这意味着 GEOIP 规则之前的所有域名类规则应该尽量把常用域名拦住,否则会产生大量额外的 DNS 查询,也可能因为 DNS 污染导致判断错误。
检查你的规则
把配置粘进配置校验器,它会检查:rules 最后一条是不是 MATCH、每条规则的字段数是否足够(GEOIP,CN 这样少了策略名的写法会被指出来)、以及每条规则指向的策略组是否真实存在。
工具在浏览器本地运行,配置不会上传。
小结
MATCH是兜底,必须在最后一条- 不写它不一定报错,但会导致难查的偶发问题
MATCH,DIRECT是黑名单思路,MATCH,策略组是白名单思路- 规则从具体到宽泛排列,宽泛的放前面会让后面的规则失效
相关文章
「策略组引用了不存在的节点」——名字对不上的四种情况
Clash 启动失败提示策略组里的某个节点找不到,本质是 proxy-groups 里写的名字和 proxies 里的 name 没有完全一致。本文列出四种容易忽略的不一致来源,以及换订阅后批量失效的处理办法。
Clash 报错「proxies 必须是数组」是什么意思,怎么改
Clash 或 mihomo 提示 proxies 不是数组、无法解析节点列表时,问题几乎都出在 YAML 的短横线和缩进上。本文说明这个报错的确切含义、四种常见成因,以及每种情况的正确写法。
YAML 缩进明明对齐了却报错?多半是 Tab 混进来了
Clash 配置提示缩进不一致、mapping items 未对齐,但肉眼看每一行都对得整整齐齐——这种情况几乎都是 Tab 和空格混用。本文说明 YAML 为什么禁止 Tab 缩进、怎么在编辑器里揪出它,以及另外两种视觉上看不出的缩进问题。