From 727eceb0cf95853c5c351b82b255cd4dc5befdd1 Mon Sep 17 00:00:00 2001 From: xmk23333 Date: Thu, 15 Jan 2026 18:13:43 +0800 Subject: [PATCH] fix: precise proxy group name replacement in smart override rules --- src/main/config/smartOverride.ts | 40 +++++++++++++++++++++++++------- 1 file changed, 32 insertions(+), 8 deletions(-) diff --git a/src/main/config/smartOverride.ts b/src/main/config/smartOverride.ts index 14d1688..48ac728 100644 --- a/src/main/config/smartOverride.ts +++ b/src/main/config/smartOverride.ts @@ -118,18 +118,42 @@ function main(config) { } // 更新规则中的代理组引用 + // 规则参数列表,这些不是策略组名称 + const ruleParamsSet = new Set(['no-resolve', 'force-remote-dns', 'prefer-ipv6']) + if (config.rules && Array.isArray(config.rules)) { config.rules = config.rules.map(rule => { if (typeof rule === 'string') { - let updatedRule = rule - nameMapping.forEach((newName, oldName) => { - // 使用简单的字符串替换,检查是否完全匹配 - if (updatedRule.includes(oldName)) { - updatedRule = updatedRule.split(oldName).join(newName) - console.log('[Smart Override] Updated rule reference:', oldName, '→', newName) + // 按逗号分割规则,精确匹配策略组名称位置 + const parts = rule.split(',').map(part => part.trim()) + + if (parts.length >= 2) { + // 找到策略组名称的位置 + let targetIndex = -1 + + // MATCH 规则:MATCH,策略组 + if (parts[0] === 'MATCH' && parts.length === 2) { + targetIndex = 1 + } else if (parts.length >= 3) { + // 其他规则:TYPE,MATCHER,策略组[,参数...] + // 策略组通常在第 3 个位置(索引 2),但需要跳过参数 + for (let i = 2; i < parts.length; i++) { + if (!ruleParamsSet.has(parts[i])) { + targetIndex = i + break + } + } } - }) - return updatedRule + + // 只替换策略组名称位置 + if (targetIndex !== -1 && nameMapping.has(parts[targetIndex])) { + const oldName = parts[targetIndex] + parts[targetIndex] = nameMapping.get(oldName) + console.log('[Smart Override] Updated rule reference:', oldName, '→', nameMapping.get(oldName)) + return parts.join(',') + } + } + return rule } else if (typeof rule === 'object' && rule !== null) { // 处理对象格式的规则 ['target', 'proxy'].forEach(field => {