diff --git a/_worker.js b/_worker.js index e3d50ec..f79bfb7 100644 --- a/_worker.js +++ b/_worker.js @@ -1217,15 +1217,24 @@ function socks5AddressParser(address) { // 解析服务器地址部分 const latters = latter.split(":"); - // 从末尾提取端口号(因为 IPv6 地址中也包含冒号) - port = Number(latters.pop().replace(/[^\d]/g, '')); + // 检查是否是IPv6地址带端口格式 [xxx]:port + if (latters.length > 2 && latter.includes("]:")) { + // IPv6地址带端口格式:[2001:db8::1]:8080 + port = Number(latter.split("]:")[1].replace(/[^\d]/g, '')); + hostname = latter.split("]:")[0] + "]"; // 正确提取hostname部分 + } else if (latters.length === 2) { + // IPv4地址带端口或域名带端口 + port = Number(latters.pop().replace(/[^\d]/g, '')); + hostname = latters.join(":"); + } else { + port = 80; + hostname = latter; + } + if (isNaN(port)) { throw new Error('无效的 SOCKS 地址格式:端口号必须是数字'); } - // 剩余部分就是主机名(可能是域名、IPv4 或 IPv6 地址) - hostname = latters.join(":"); - // 处理 IPv6 地址的特殊情况 // IPv6 地址包含多个冒号,所以必须用方括号括起来,如 [2001:db8::1] const regex = /^\[.*\]$/;