#10181·v2rayN

[Bug]: sing-box 生成配置不处理编码 ws path,?ed= 节点全 400

Author: v2cnCreated Sep 15, 2026Updated Sep 15, 2026
Labelsbug

操作系统 / 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 中保存的 PathURL 编码形式 %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"。服务器对编码路径返回 HTTP unexpected HTTP response status: 400,整组节点真延迟测试全部失败(-1)。

Related: PR #8367 已处理解码形式的 ?ed=,但未处理 URL 编码形式。

复现方法

  1. 导入 ws 分享链接/订阅,URI 中 path 为编码形式 %2F%3Fed%3D2048(订阅源原生即如此)。
  2. 「设置 → Core 类型设置」将 VLESS 核心类型整体切换为 sing-box。
  3. 真延迟测试,该组全部 -1;v2rayN 侧报 unexpected HTTP response status: 400
  4. 手工把节点 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

我确认系统版本是受支持的