[Bug]: sing-box 生成配置不处理编码 ws path,?ed= 节点全 400
操作系统 / v2rayN / Core 版本
Windows 11 23H2 (10.0.22631) / v2rayN 7.25.1 X64 / sing-box 1.14.0 / Xray 26.9.9
预期情况
不论订阅中的 ws path 是编码还是解码形式,导入/生成配置后行为应一致:?ed= / ?eh= 参数被解析为 max_early_data / early_data_header_name,sing-box 配置里的 transport.path 为解码后的原始路径,节点可正常连接、真延迟测试正常返回延迟值。
实际情况
导入包含 vless + ws(Cloudflare CDN 中转)节点的订阅,这类节点的 WebSocket path 携带 ed=2048(0-RTT early data 参数)。订阅导入后,数据库 ProfileItem.TransportExtra 中保存的 Path 是 URL 编码形式 %2F%3Fed%3D2048,而原始应为 /?ed=2048。
生成核心配置时:
- Xray 内核:一切正常(Xray 自行处理编码 path)。
- sing-box 内核:PR #8367 引入的
[?&]ed=(\d+)转换逻辑(SingboxOutboundService.cs的 ws 分支)匹配不到编码形式,max_early_data/early_data_header_name均未生成,outbound 的transport.path直接为字面的"%2F%3Fed%3D2048"。服务器对编码路径返回 HTTPunexpected HTTP response status: 400,整组节点真延迟测试全部失败(-1)。
Related: PR #8367 已处理解码形式的 ?ed=,但未处理 URL 编码形式。
复现方法
- 导入 ws 分享链接/订阅,URI 中 path 为编码形式
%2F%3Fed%3D2048(订阅源原生即如此)。 - 「设置 → Core 类型设置」将 VLESS 核心类型整体切换为 sing-box。
- 真延迟测试,该组全部 -1;v2rayN 侧报
unexpected HTTP response status: 400。 - 手工把节点 path 改回
/?ed=2048后,sing-box 立即恢复正常。
生成的配置对比
导入后(异常,7.25.1 实际输出):
{
"type": "vless",
"transport": {
"type": "ws",
"path": "%2F%3Fed%3D2048"
}
}
期望值(path 解码 + ed 转换,与同格式人工创建的节点一致):
{
"type": "vless",
"transport": {
"type": "ws",
"path": "/",
"max_early_data": 2048,
"early_data_header_name": "Sec-WebSocket-Protocol"
}
}
数据样例(节点导入后本地数据库中的实际值)
{"Host":"<server-domain>","Path":"%2F%3Fed%3D2048"} ← 导入后(异常)
{"Host":"<server-domain>","Path":"/?ed=2048"} ← 解码后(正常)
建议修复
在订阅导入(BaseFmt 解析阶段)将 TransportExtra.Path 统一存为解码后的原始形式;或在 SingboxOutboundService.cs 的 ws 分支生成配置前,先对 path 做 Uri.UnescapeDataString,再做 [?&]ed= / [?&]eh= 参数转换。
软件日志
2026-09-16 00:49:39.9223-INFO v2rayN start up | v2rayN - V7.25.1 - X64 | C:\v2rayN\ | v2rayN.exe | Microsoft Windows NT 10.0.22631.0 2026-09-16 00:50:19 INFO 生成日常(全局)配置,VLESS 核心类型 = sing_box 2026-09-16 00:50:45 DEBUG configTest*.json 生成完成(vless 批量真延迟,含 URL 编码 path 的 ws 节点 100+ 个)
内核日志
sing-box 真延迟批测进程实际捕获(出站 tag proxy10829,其 transport.path 为字面 "%2F%3Fed%3D2048"):
ERROR [...] connection: open connection to www.gstatic.com:80 using outbound/vless[proxy10829]: unexpected HTTP response status: 400
ERROR [...] connection: open connection to www.gstatic.com:80 using outbound/vless[proxy10829]: unexpected HTTP response status: 400
手工将该节点 path 改为解码形式 /?ed=2048 后,同一节点生成的 sing-box 配置中出现:
"transport": { "type": "ws", "path": "/", "max_early_data": 2048, "early_data_header_name": "Sec-WebSocket-Protocol" }
连接恢复正常(HTTP 204),确认 400 由编码 path 直接透传引起。
额外信息
No response
我确认已更新至最新版本
- 是
我确认已查询历史issues
- 是
我确认系统版本是受支持的
- 是
Source: 2dust/v2rayN