@@ -787,13 +787,10 @@ async function httpConnect(targetHost, targetPort, initialData) {
787787}
788788//////////////////////////////////////////////////功能性函数///////////////////////////////////////////////
789789function Clash订阅配置文件热补丁 ( Clash_原始订阅内容 , uuid = null , ECH启用 = false , HOSTS = [ ] ) {
790- if ( ! ECH启用 || HOSTS . length === 0 ) return Clash_原始订阅内容 ;
790+ let clash_yaml = Clash_原始订阅内容 . replace ( / m o d e : \s * R u l e \b / g , 'mode: rule' ) ;
791791
792- // 生成 HOSTS 的 nameserver-policy 条目
793- const hostsEntries = HOSTS . map ( host => ` "${ host } ":\n - tls://8.8.8.8\n - https://doh.cmliussss.com/CMLiussss\n - ${ ECH_DOH } ` ) . join ( '\n' ) ;
794-
795- // 完整的 DNS 配置块(用于没有 dns: 字段时添加)
796- const fullDnsBlock = `dns:
792+ // 基础 DNS 配置块(不含 nameserver-policy)
793+ const baseDnsBlock = `dns:
797794 enable: true
798795 default-nameserver:
799796 - 223.5.5.5
@@ -814,17 +811,22 @@ function Clash订阅配置文件热补丁(Clash_原始订阅内容, uuid = null,
814811 - 240.0.0.0/4
815812 - 0.0.0.0/32
816813 geoip-code: CN
817- nameserver-policy:
818- ${ hostsEntries }
819814` ;
820815
821- let clash_yaml = Clash_原始订阅内容 ;
822-
823816 // 检查是否存在 dns: 字段(可能在任意行,行首无缩进)
824817 const hasDns = / ^ d n s : \s * (?: \n | $ ) / m. test ( clash_yaml ) ;
825818
826- if ( hasDns ) {
827- // 存在 dns: 字段,检查是否存在 nameserver-policy:
819+ // 无论 ECH 是否启用,都确保存在 dns: 配置块
820+ if ( ! hasDns ) {
821+ clash_yaml = baseDnsBlock + clash_yaml ;
822+ }
823+
824+ // 如果 ECH 启用且 HOSTS 有效,添加 nameserver-policy
825+ if ( ECH启用 && HOSTS . length > 0 ) {
826+ // 生成 HOSTS 的 nameserver-policy 条目
827+ const hostsEntries = HOSTS . map ( host => ` "${ host } ":\n - tls://8.8.8.8\n - https://doh.cmliussss.com/CMLiussss\n - ${ ECH_DOH } ` ) . join ( '\n' ) ;
828+
829+ // 检查是否存在 nameserver-policy:
828830 const hasNameserverPolicy = / ^ \s { 2 } n a m e s e r v e r - p o l i c y : \s * (?: \n | $ ) / m. test ( clash_yaml ) ;
829831
830832 if ( hasNameserverPolicy ) {
@@ -835,7 +837,6 @@ ${hostsEntries}
835837 ) ;
836838 } else {
837839 // 不存在 nameserver-policy:,需要在 dns: 块内添加整个 nameserver-policy
838- // 找到 dns: 块的结束位置(下一个顶级字段之前)
839840 const lines = clash_yaml . split ( '\n' ) ;
840841 let dnsBlockEndIndex = - 1 ;
841842 let inDnsBlock = false ;
@@ -865,12 +866,12 @@ ${hostsEntries}
865866 }
866867 clash_yaml = lines . join ( '\n' ) ;
867868 }
868- } else {
869- // 不存在 dns: 字段,在文件开头添加完整的 DNS 配置块
870- clash_yaml = fullDnsBlock + clash_yaml ;
871869 }
872870
873- if ( ! uuid ) return clash_yaml ;
871+ // 如果没有 uuid 或 ECH 未启用,直接返回
872+ if ( ! uuid || ! ECH启用 ) return clash_yaml ;
873+
874+ // ECH 启用时,处理代理节点添加 ech-opts
874875 const lines = clash_yaml . split ( '\n' ) ;
875876 const processedLines = [ ] ;
876877 let i = 0 ;
0 commit comments