适用条件
要核对“最终选中的代理”是哪一个出站,必须从规则引用的策略组开始,一层层展开成员,而不是只看最外层组名。官方可用于核对的信息都在代理组字段上:name、type、proxies、use、各类 include 开关、筛选、default-selected、empty-fallback,以及只覆盖部分成员的健康检查。适用于嵌套组、引入全部节点、或集合与手写列表混用之后,需要确认叶子代理是谁的场景。hidden 与 icon 只影响 API 展示,核对选中结果时可以忽略它们。
逐层核对的步骤
第一层核对入口。记录规则指向的 name,含特殊符号时确认是否用引号包裹。没有这一步,后面展开的可能是另一个同名字面量。确认 type 已填写,因为该字段为必须项。
第二层列出本层全部候选,而不是只看 default-selected 四个字。候选来自:proxies 中的出站代理与其它策略组;use 的代理集合;include-all(全部出站代理以及代理集合)、include-all-proxies(全部出站代理)、include-all-providers(全部代理集合)。后三项按名称排序。注意:include-all 与 include-all-proxies 引入不包含策略组,内层组只会来自 proxies。include-all-providers 会使引入代理集合失效,本层名单要以开关打开后的结果为准。
第三层做减法。filter、exclude-filter 按关键词或正则筛节点,多个正则可用反引号区分,且仅作用于引入代理集合以及引入所有出站代理。exclude-type 不支持正则,用 | 分割,按节点类型排除引入的出站代理。手写在 proxies 里的策略组名不按这些规则当节点删除。筛完后若名单为空,本层不会“继续用外层的选择”,而是使用 empty-fallback;该值默认 COMPATIBLE,只支持 proxy 名称,不支持代理组。
第四层落本层选中项。default-selected 命中筛选后仍存在的成员则选它;为空或名称不存在则选组中第一个节点。若选中项是出站代理,核对结束,该代理即为本层叶子。若选中项是另一策略组,把该组当作新的入口,重复第二层到第四层,直到叶子为出站代理。每一层的第一个节点都相对于“该层排序并筛选后的列表”,不能把外层的顺序套到内层。
第五层单独核对可用性信息是否被误当成选中结果。url 只检查 proxies 字段里的代理,不检查 use 引入的集合。interval 不为 0 才定时测试;timeout 为毫秒;max-failed-times 默认 5;expected-status 可用 / 与 - 描述期望状态码,未配置时默认为 *。lazy 默认 true,未选择到当前策略组时不测试。这些说明“有没有被测到”,不自动改写 default-selected。disable-udp 也不改变选中的是哪一个成员。
判断依据与失败后的下一步
判断核对完成的依据是:从入口组到叶子代理的每一跳都能在对应层的候选名单里找到;默认规则在每一层都按“指定名,否则第一个,再否则 empty-fallback 的 proxy”执行;没有任何一跳把策略组写进了 empty-fallback。若中途断掉,下一步应检查引号与名称是否一致、include 开关是否改变排序或让集合引入失效、筛选是否清空叶子,以及是否把只存在于集合中的节点误当成已被 url 检查。出站接口与路由标记以代理节点为准,组上的 interface-name、routing-mark 已弃用,优先级为代理节点大于代理策略大于全局;叶子核对完毕后若流量出口网卡仍不对,应转到节点字段,而不是继续在组与组之间查找。