适用条件:什么时候该写精确域名
Clash(mihomo)的 DOMAIN 用于匹配完整域名。适用条件是:你已经能确定请求里的主机名就是某一个固定字符串,既不打算带上它的子域,也不打算用一段后缀去覆盖一批站点。官方示例写作 DOMAIN,ad.com,REJECT,含义是仅当域名为 ad.com 本身时命中,并走向该行给出的策略。
若目标是主域连同各级子域共用一条策略,或只记得关键字、或要用 *、?、正则描述变体,就不属于精确域名的写法,应分别改用 DOMAIN-SUFFIX、DOMAIN-KEYWORD、DOMAIN-WILDCARD、DOMAIN-REGEX。规则按从上到下的顺序匹配,列表顶部优先级更高;精确行写得再规范,也可能被更靠前的宽规则先截走。因此“写清楚”不只是字段齐全,还包括它在列表中的位置与真实意图一致。
按官方字段把一行写清楚
一行精确规则只保留三个核心部分:类型、完整域名、策略。类型必须写 DOMAIN,不要把后缀或通配符塞进这一列。域名按请求中的完整主机名抄录,包含每一个点号;官方用 ad.com,而不是 ad 或 *.ad.com。策略必须是配置里已有的出站、代理组,或示例中出现过的 REJECT、DIRECT、PROXY、auto。
同一主机名不要叠两条互相抢优先级的 DOMAIN。若还要限制传输层等条件,使用逻辑规则,官方形式为 LOGIC_TYPE,((payload1),(payload2)),Proxy,并注意括号,例如 AND,((DOMAIN,baidu.com),(NETWORK,UDP)),DIRECT。不要把 DOMAIN-WILDCARD 允许的 *、? 写进 DOMAIN 行;官方注明这里的通配符与配置文件其他地方的 Clash 格式通配符并不相同,精确规则更不应借用那套符号。
阅读顺序上,把真正只针对单一主机名的拦截或直连放在较前,把较宽的后缀、关键字、GEOSITE、RULE-SET 放在后面,最后才是无需条件的 MATCH。这样打开 rules 列表时,可以直接看出哪一行是“只对这一个完整域名生效”。
写完是否清楚的判断依据与失败时下一步
判断依据有三条。第一,只看该行应能回答“哪一个完整主机名、去哪一个策略”,无需猜测是否包含子域。第二,将该主机名与仅多一个子域标签的名字对比,按官方定义只有完全一致才命中 DOMAIN。第三,从文件顶部往下读,没有更早的规则会先吃掉同一请求。
若精确主机名没有走到预期策略,下一步先核对拼写、点号是否与实际请求一致。接着检查该行上方是否已有 DOMAIN-SUFFIX、DOMAIN-KEYWORD、GEOSITE 或 RULE-SET。若业务其实需要覆盖子域,应改规则类型,而不是继续堆精确行。逻辑组合未生效时,检查括号是否包住每一条 payload。仍无法判断时,把该 DOMAIN 临时放到列表顶部做优先级对照,确认后按用途移回;不要把它留在 MATCH 之后,因为 MATCH 匹配所有请求,其后的规则不会再生效。