From 11964e6d3e9b6bcc1ca9a2802d7a395aa0a998f5 Mon Sep 17 00:00:00 2001 From: cmliu Date: Wed, 21 Jan 2026 17:48:15 +0800 Subject: [PATCH 1/2] =?UTF-8?q?fix:=20=E6=9B=B4=E6=96=B0Clash=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=EF=BC=8C=E6=94=AF=E6=8C=81HOSTS=E5=8F=82=E6=95=B0?= =?UTF-8?q?=E5=B9=B6=E4=BC=98=E5=8C=96DNS=E9=85=8D=E7=BD=AE=E9=80=BB?= =?UTF-8?q?=E8=BE=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- _worker.js | 71 ++++++++++++++++++++++++++++++++++++++++++++++++------ 1 file changed, 63 insertions(+), 8 deletions(-) diff --git a/_worker.js b/_worker.js index 7f8d197..32af396 100644 --- a/_worker.js +++ b/_worker.js @@ -325,7 +325,7 @@ export default { 订阅内容 = Singbox订阅配置文件热补丁(订阅内容, config_JSON.UUID, config_JSON.Fingerprint, config_JSON.ECH ? await getECH(host) : null); responseHeaders["content-type"] = 'application/json; charset=utf-8'; } else if (订阅类型 === 'clash') { - 订阅内容 = Clash订阅配置文件热补丁(订阅内容, config_JSON.UUID, config_JSON.ECH); + 订阅内容 = Clash订阅配置文件热补丁(订阅内容, config_JSON.UUID, config_JSON.ECH, config_JSON.HOSTS); responseHeaders["content-type"] = 'application/x-yaml; charset=utf-8'; } return new Response(订阅内容, { status: 200, headers: responseHeaders }); @@ -786,10 +786,14 @@ async function httpConnect(targetHost, targetPort, initialData) { } } //////////////////////////////////////////////////功能性函数/////////////////////////////////////////////// -function Clash订阅配置文件热补丁(Clash_原始订阅内容, uuid = null, ECH启用 = false) { - if (!ECH启用) return Clash_原始订阅内容; +function Clash订阅配置文件热补丁(Clash_原始订阅内容, uuid = null, ECH启用 = false, HOSTS = []) { + if (!ECH启用 || HOSTS.length === 0) return Clash_原始订阅内容; - const clash_yaml = `dns: + // 生成 HOSTS 的 nameserver-policy 条目 + const hostsEntries = HOSTS.map(host => ` "${host}":\n - https://doh.cmliussss.com/CMLiussss\n - ${ECH_DOH}`).join('\n'); + + // 完整的 DNS 配置块(用于没有 dns: 字段时添加) + const fullDnsBlock = `dns: enable: true default-nameserver: - 223.5.5.5 @@ -810,10 +814,61 @@ function Clash订阅配置文件热补丁(Clash_原始订阅内容, uuid = null, - 240.0.0.0/4 - 0.0.0.0/32 geoip-code: CN - proxy-server-nameserver: - - https://doh.cmliussss.com/CMLiussss - - ${ECH_DOH} -` + Clash_原始订阅内容; + nameserver-policy: +${hostsEntries} +`; + + let clash_yaml = Clash_原始订阅内容; + + // 检查是否存在 dns: 字段(可能在任意行,行首无缩进) + const hasDns = /^dns:\s*(?:\n|$)/m.test(clash_yaml); + + if (hasDns) { + // 存在 dns: 字段,检查是否存在 nameserver-policy: + const hasNameserverPolicy = /^\s{2}nameserver-policy:\s*(?:\n|$)/m.test(clash_yaml); + + if (hasNameserverPolicy) { + // 存在 nameserver-policy:,在其后添加 HOSTS 条目 + clash_yaml = clash_yaml.replace( + /^(\s{2}nameserver-policy:\s*\n)/m, + `$1${hostsEntries}\n` + ); + } else { + // 不存在 nameserver-policy:,需要在 dns: 块内添加整个 nameserver-policy + // 找到 dns: 块的结束位置(下一个顶级字段之前) + const lines = clash_yaml.split('\n'); + let dnsBlockEndIndex = -1; + let inDnsBlock = false; + + for (let i = 0; i < lines.length; i++) { + const line = lines[i]; + if (/^dns:\s*$/.test(line)) { + inDnsBlock = true; + continue; + } + if (inDnsBlock) { + // 检查是否是新的顶级字段(行首无空格且不是空行且不是注释) + if (/^[a-zA-Z]/.test(line)) { + dnsBlockEndIndex = i; + break; + } + } + } + + // 在 dns 块末尾插入 nameserver-policy + const nameserverPolicyBlock = ` nameserver-policy:\n${hostsEntries}`; + if (dnsBlockEndIndex !== -1) { + lines.splice(dnsBlockEndIndex, 0, nameserverPolicyBlock); + } else { + // dns: 是最后一个顶级块,在文件末尾添加 + lines.push(nameserverPolicyBlock); + } + clash_yaml = lines.join('\n'); + } + } else { + // 不存在 dns: 字段,在文件开头添加完整的 DNS 配置块 + clash_yaml = fullDnsBlock + clash_yaml; + } if (!uuid) return clash_yaml; const lines = clash_yaml.split('\n'); From 97343eefe8b0f57c6491b627924ed5c0f7ea674b Mon Sep 17 00:00:00 2001 From: cmliu Date: Wed, 21 Jan 2026 18:01:25 +0800 Subject: [PATCH 2/2] =?UTF-8?q?fix:=20=E6=9B=B4=E6=96=B0Clash=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=EF=BC=8C=E4=BC=98=E5=8C=96HOSTS=E6=9D=A1=E7=9B=AE?= =?UTF-8?q?=E7=94=9F=E6=88=90=E9=80=BB=E8=BE=91=EF=BC=8C=E4=BD=BF=E7=94=A8?= =?UTF-8?q?tls=E5=8D=8F=E8=AE=AE=E6=9B=BF=E4=BB=A3=E5=8E=9F=E6=9C=89?= =?UTF-8?q?=E9=85=8D=E7=BD=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- _worker.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/_worker.js b/_worker.js index 32af396..975c85a 100644 --- a/_worker.js +++ b/_worker.js @@ -790,7 +790,7 @@ function Clash订阅配置文件热补丁(Clash_原始订阅内容, uuid = null, if (!ECH启用 || HOSTS.length === 0) return Clash_原始订阅内容; // 生成 HOSTS 的 nameserver-policy 条目 - const hostsEntries = HOSTS.map(host => ` "${host}":\n - https://doh.cmliussss.com/CMLiussss\n - ${ECH_DOH}`).join('\n'); + 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: