From 9ade997de626c3c3dff462ec1d3105f40f9ef0c3 Mon Sep 17 00:00:00 2001 From: cmliu Date: Wed, 21 Jan 2026 18:19:08 +0800 Subject: [PATCH] =?UTF-8?q?fix:=20=E4=BC=98=E5=8C=96Clash=E8=AE=A2?= =?UTF-8?q?=E9=98=85=E9=85=8D=E7=BD=AE=E6=96=87=E4=BB=B6=E7=83=AD=E8=A1=A5?= =?UTF-8?q?=E4=B8=81=E9=80=BB=E8=BE=91=EF=BC=8C=E7=A1=AE=E4=BF=9Ddns?= =?UTF-8?q?=E9=85=8D=E7=BD=AE=E5=9D=97=E5=AD=98=E5=9C=A8=E5=B9=B6=E6=A0=B9?= =?UTF-8?q?=E6=8D=AE=E6=9D=A1=E4=BB=B6=E6=B7=BB=E5=8A=A0nameserver-policy?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- _worker.js | 35 ++++++++++++++++++----------------- 1 file changed, 18 insertions(+), 17 deletions(-) diff --git a/_worker.js b/_worker.js index 975c85a..e425341 100644 --- a/_worker.js +++ b/_worker.js @@ -787,13 +787,10 @@ async function httpConnect(targetHost, targetPort, initialData) { } //////////////////////////////////////////////////功能性函数/////////////////////////////////////////////// function Clash订阅配置文件热补丁(Clash_原始订阅内容, uuid = null, ECH启用 = false, HOSTS = []) { - if (!ECH启用 || HOSTS.length === 0) return Clash_原始订阅内容; + let clash_yaml = Clash_原始订阅内容; - // 生成 HOSTS 的 nameserver-policy 条目 - const hostsEntries = HOSTS.map(host => ` "${host}":\n - tls://8.8.8.8\n - https://doh.cmliussss.com/CMLiussss\n - ${ECH_DOH}`).join('\n'); - - // 完整的 DNS 配置块(用于没有 dns: 字段时添加) - const fullDnsBlock = `dns: + // 基础 DNS 配置块(不含 nameserver-policy) + const baseDnsBlock = `dns: enable: true default-nameserver: - 223.5.5.5 @@ -814,17 +811,22 @@ function Clash订阅配置文件热补丁(Clash_原始订阅内容, uuid = null, - 240.0.0.0/4 - 0.0.0.0/32 geoip-code: CN - nameserver-policy: -${hostsEntries} `; - let clash_yaml = Clash_原始订阅内容; - // 检查是否存在 dns: 字段(可能在任意行,行首无缩进) const hasDns = /^dns:\s*(?:\n|$)/m.test(clash_yaml); - if (hasDns) { - // 存在 dns: 字段,检查是否存在 nameserver-policy: + // 无论 ECH 是否启用,都确保存在 dns: 配置块 + if (!hasDns) { + clash_yaml = baseDnsBlock + clash_yaml; + } + + // 如果 ECH 启用且 HOSTS 有效,添加 nameserver-policy + if (ECH启用 && HOSTS.length > 0) { + // 生成 HOSTS 的 nameserver-policy 条目 + const hostsEntries = HOSTS.map(host => ` "${host}":\n - tls://8.8.8.8\n - https://doh.cmliussss.com/CMLiussss\n - ${ECH_DOH}`).join('\n'); + + // 检查是否存在 nameserver-policy: const hasNameserverPolicy = /^\s{2}nameserver-policy:\s*(?:\n|$)/m.test(clash_yaml); if (hasNameserverPolicy) { @@ -835,7 +837,6 @@ ${hostsEntries} ); } else { // 不存在 nameserver-policy:,需要在 dns: 块内添加整个 nameserver-policy - // 找到 dns: 块的结束位置(下一个顶级字段之前) const lines = clash_yaml.split('\n'); let dnsBlockEndIndex = -1; let inDnsBlock = false; @@ -865,12 +866,12 @@ ${hostsEntries} } clash_yaml = lines.join('\n'); } - } else { - // 不存在 dns: 字段,在文件开头添加完整的 DNS 配置块 - clash_yaml = fullDnsBlock + clash_yaml; } - if (!uuid) return clash_yaml; + // 如果没有 uuid 或 ECH 未启用,直接返回 + if (!uuid || !ECH启用) return clash_yaml; + + // ECH 启用时,处理代理节点添加 ech-opts const lines = clash_yaml.split('\n'); const processedLines = []; let i = 0;