@@ -325,7 +325,7 @@ export default {
325325 订阅内容 = Singbox订阅配置文件热补丁 ( 订阅内容 , config_JSON . UUID , config_JSON . Fingerprint , config_JSON . ECH ? await getECH ( host ) : null ) ;
326326 responseHeaders [ "content-type" ] = 'application/json; charset=utf-8' ;
327327 } else if ( 订阅类型 === 'clash' ) {
328- 订阅内容 = Clash订阅配置文件热补丁 ( 订阅内容 , config_JSON . UUID , config_JSON . ECH ) ;
328+ 订阅内容 = Clash订阅配置文件热补丁 ( 订阅内容 , config_JSON . UUID , config_JSON . ECH , config_JSON . HOSTS ) ;
329329 responseHeaders [ "content-type" ] = 'application/x-yaml; charset=utf-8' ;
330330 }
331331 return new Response ( 订阅内容 , { status : 200 , headers : responseHeaders } ) ;
@@ -786,10 +786,14 @@ async function httpConnect(targetHost, targetPort, initialData) {
786786 }
787787}
788788//////////////////////////////////////////////////功能性函数///////////////////////////////////////////////
789- function Clash订阅配置文件热补丁 ( Clash_原始订阅内容 , uuid = null , ECH启用 = false ) {
790- if ( ! ECH启用 ) return Clash_原始订阅内容 ;
789+ function Clash订阅配置文件热补丁 ( Clash_原始订阅内容 , uuid = null , ECH启用 = false , HOSTS = [ ] ) {
790+ if ( ! ECH启用 || HOSTS . length === 0 ) return Clash_原始订阅内容 ;
791791
792- const clash_yaml = `dns:
792+ // 生成 HOSTS 的 nameserver-policy 条目
793+ const hostsEntries = HOSTS . map ( host => ` "${ host } ":\n - https://doh.cmliussss.com/CMLiussss\n - ${ ECH_DOH } ` ) . join ( '\n' ) ;
794+
795+ // 完整的 DNS 配置块(用于没有 dns: 字段时添加)
796+ const fullDnsBlock = `dns:
793797 enable: true
794798 default-nameserver:
795799 - 223.5.5.5
@@ -810,10 +814,61 @@ function Clash订阅配置文件热补丁(Clash_原始订阅内容, uuid = null,
810814 - 240.0.0.0/4
811815 - 0.0.0.0/32
812816 geoip-code: CN
813- proxy-server-nameserver:
814- - https://doh.cmliussss.com/CMLiussss
815- - ${ ECH_DOH }
816- ` + Clash_原始订阅内容 ;
817+ nameserver-policy:
818+ ${ hostsEntries }
819+ ` ;
820+
821+ let clash_yaml = Clash_原始订阅内容 ;
822+
823+ // 检查是否存在 dns: 字段(可能在任意行,行首无缩进)
824+ const hasDns = / ^ d n s : \s * (?: \n | $ ) / m. test ( clash_yaml ) ;
825+
826+ if ( hasDns ) {
827+ // 存在 dns: 字段,检查是否存在 nameserver-policy:
828+ 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 ) ;
829+
830+ if ( hasNameserverPolicy ) {
831+ // 存在 nameserver-policy:,在其后添加 HOSTS 条目
832+ clash_yaml = clash_yaml . replace (
833+ / ^ ( \s { 2 } n a m e s e r v e r - p o l i c y : \s * \n ) / m,
834+ `$1${ hostsEntries } \n`
835+ ) ;
836+ } else {
837+ // 不存在 nameserver-policy:,需要在 dns: 块内添加整个 nameserver-policy
838+ // 找到 dns: 块的结束位置(下一个顶级字段之前)
839+ const lines = clash_yaml . split ( '\n' ) ;
840+ let dnsBlockEndIndex = - 1 ;
841+ let inDnsBlock = false ;
842+
843+ for ( let i = 0 ; i < lines . length ; i ++ ) {
844+ const line = lines [ i ] ;
845+ if ( / ^ d n s : \s * $ / . test ( line ) ) {
846+ inDnsBlock = true ;
847+ continue ;
848+ }
849+ if ( inDnsBlock ) {
850+ // 检查是否是新的顶级字段(行首无空格且不是空行且不是注释)
851+ if ( / ^ [ a - z A - Z ] / . test ( line ) ) {
852+ dnsBlockEndIndex = i ;
853+ break ;
854+ }
855+ }
856+ }
857+
858+ // 在 dns 块末尾插入 nameserver-policy
859+ const nameserverPolicyBlock = ` nameserver-policy:\n${ hostsEntries } ` ;
860+ if ( dnsBlockEndIndex !== - 1 ) {
861+ lines . splice ( dnsBlockEndIndex , 0 , nameserverPolicyBlock ) ;
862+ } else {
863+ // dns: 是最后一个顶级块,在文件末尾添加
864+ lines . push ( nameserverPolicyBlock ) ;
865+ }
866+ clash_yaml = lines . join ( '\n' ) ;
867+ }
868+ } else {
869+ // 不存在 dns: 字段,在文件开头添加完整的 DNS 配置块
870+ clash_yaml = fullDnsBlock + clash_yaml ;
871+ }
817872
818873 if ( ! uuid ) return clash_yaml ;
819874 const lines = clash_yaml . split ( '\n' ) ;
0 commit comments