2026-06-08 · 订阅管理 · 约 12 分钟

V2Ray 订阅格式详解:base64、原生 JSON 与分享链接如何互相转换

拆解三种常见订阅格式的结构与适用客户端,说明 base64 编码订阅、原生 JSON 配置与 vmess:// 分享链接之间的转换思路和注意事项。
本文速览
本文适合需要判断订阅内容、迁移单个节点或排查导入失败的用户。读完可以分清编码容器、分享链接和核心配置三层结构,并按字段映射完成可控转换。

先分清编码、节点与运行配置

“V2Ray 订阅”不是一种严格统一的文件格式。实际使用中,这个词可能指一个返回多行分享链接的网络地址,也可能指已经解码的节点列表,还可能指能够直接交给 V2Fly 或 Xray 内核读取的 JSON 配置。三者看起来都包含服务器信息,但用途和信息量并不相同。
base64 只是编码方法,不是协议。它把文本转换为一组便于传输的字符,不会自动验证服务器、补全传输参数或生成路由规则。常见订阅响应的内层内容是按换行分隔的 vmess://vless://trojan:// 链接,外层再整体进行一次 base64 编码。
分享链接描述的是一个出站节点。它通常包含服务器地址、端口、用户标识、传输方式、TLS 参数和备注。原生 JSON 则面向核心运行,除出站外还可能包含入站监听、DNS、日志、路由规则和策略设置。因此,从 JSON 提取分享链接往往只能保留其中一个出站,反向转换也无法凭空恢复原来的整套规则。

base64 订阅

推荐
适合集中发布多个节点,客户端可按订阅地址定期更新。解码后通常得到一行一个分享链接的文本。
适合:日常订阅更新、多节点分组

单条分享链接

便于复制一个节点并跨设备导入,字段范围集中在该节点的出站连接参数。
适合:单节点迁移、逐项检查参数

原生 JSON

直接表达核心配置树,可容纳多个入站、出站、DNS 与路由规则,结构最完整。
适合:精细路由、手工维护核心配置

结论:先判断外层,再解析内层

看到一长串字符时不要连续解码多次。先判断响应是否为 JSON、明文链接列表或 base64 文本,每完成一层转换就检查结果是否出现合法协议头。

base64 订阅内部是什么

典型订阅服务返回纯文本。客户端获取响应后去除首尾空白,执行一次 base64 解码,再按 \n\r\n 拆分。空行应被忽略,每个非空行再依据协议头交给对应解析器。若解码结果已经以左花括号开头,它可能是 JSON,不应继续当作链接列表拆分。
标准 base64 使用大小写字母、数字、加号和斜杠,末尾可能带等号补位。URL 安全变体会把加号和斜杠替换为减号和下划线。部分订阅省略末尾补位,解析器需要按长度补齐,但不能修改中间字符。UTF-8 字节顺序标记、响应前后的提示文字和 HTML 错误页也会导致解码失败。
外层订阅响应 ↓ base64 解码一次 vmess://编码后的节点描述 vless://用户标识@edge.example:443?encryption=none&security=tls&type=ws#示例节点 trojan://认证信息@edge.example:443?security=tls&type=tcp#备用节点 ↓ 按行识别协议 节点 1、节点 2、节点 3
判断内容是否真是订阅,不能只看字符是否符合 base64 字符集。短英文、数字串甚至普通文本也可能碰巧满足字符规则。更稳妥的判断是:解码后的 UTF-8 文本中存在受支持的协议头,或得到符合预期结构的 JSON。服务器返回状态也要检查,例如 HTTP 200 才进入解析流程,301 或 302 应按客户端策略处理跳转,401 和 403 则通常表示地址凭据或访问条件发生变化。

常见响应特征

  • 明文列表: 第一行直接以 vmess://vless://trojan:// 开头,无需先解码外层。
  • 编码列表: 响应主体是一段连续字符,解码一次后出现多行协议链接。
  • JSON 响应: 顶层可能是对象或数组,需要按提供方定义读取,不能套用通用换行规则。
  • 错误页面: 内容以 <html 或可读错误说明开头,应停止转换并检查订阅地址。

VMess、VLESS 分享链接的字段差异

vmess:// 常见写法是把一个节点 JSON 对象整体编码后放在协议头后面。解码对象中常见字段包括版本、备注、服务器地址、端口、用户标识、传输方式、伪装类型、路径、TLS 和 SNI。字段名在历史实现中较短,例如 add 表示地址、port 表示端口、id 表示用户标识。
vless:// 更接近标准 URL:用户标识位于用户名位置,主机和端口位于 authority 部分,传输与安全参数位于查询字符串,备注位于井号之后。解析时必须先进行 URL 百分号解码,并区分查询参数与备注。端口 443 常用于 TLS 连接,端口 80 常见于未启用 TLS 的 HTTP 或 WebSocket 入口,但端口本身不能证明安全层是否开启。
连接信息 VMess 常见字段 VLESS URL 位置 转换注意点
服务器地址 add 主机部分 域名与 IPv6 地址的写法不同,IPv6 需保留方括号语义
端口 port 主机后的端口 应转换为 1 至 65535 的整数
用户标识 id 用户名部分 只能复制已有值,不能由备注或服务器地址推导
传输方式 net type 参数 WebSocket、TCP、gRPC 的附加字段各不相同
路径或服务名 path pathserviceName 斜杠、空格与特殊字符需要正确编码
服务器名称 sni sni 参数 不要默认等同于连接地址
备注 ps 井号后的 fragment 只影响显示名称,不参与建立连接
VMess 链接中不同生成器可能把布尔值写成字符串,把端口写成数字或字符串。转换工具应先规范类型,再输出目标格式。VLESS 链接则要处理重复查询参数、参数大小写和百分号编码。未知参数最好原样保留到扩展字段,而不是静默丢弃。

结论:协议名相同不代表参数等价

转换时至少核对地址、端口、用户标识、传输方式、安全层、SNI、路径七项。只复制前三项,经常会得到能够导入但无法建立连接的节点。

原生 JSON 为什么不能直接当订阅

核心 JSON 是完整运行配置。一个常见桌面配置会声明本地入站,例如在回环地址监听端口 10808,再定义一个或多个出站。路由部分根据域名、IP 或入站标签选择出站,DNS 部分决定解析方式。分享链接没有足够空间表达这套关系,客户端通常会使用自己的默认入站和路由模板。
下面的结构只展示字段层级,其中说明文字不是可直接连接的配置。它说明同一个出站节点在原生 JSON 中需要嵌入 outbounds,而本地代理端口位于 inbounds,两者不能混为一谈。
{ "inbounds": [ { "listen": "127.0.0.1", "port": 10808, "protocol": "socks" } ], "outbounds": [ { "tag": "proxy", "protocol": "vmess", "settings": { "vnext": [ { "address": "edge.example", "port": 443, "users": [ { "id": "由服务提供方分配的用户标识", "security": "auto" } ] } ] }, "streamSettings": { "network": "ws", "security": "tls", "wsSettings": { "path": "/gateway" } } } ] }
从原生 JSON 生成 VMess 分享链接时,应先选择目标出站,再读取 settings.vnext 中的服务器与用户信息,最后把 streamSettings 映射到传输字段。若一个出站包含多个服务器或多个用户,就可能需要展开为多条链接。反向生成 JSON 时,客户端还必须补充本地入站、日志和路由默认值。

转换时通常会丢失的内容

  • 按域名、IP、端口或进程设置的路由规则及其优先顺序。
  • 多个出站之间的负载选择、故障转移和标签引用关系。
  • 本地 SOCKS、HTTP 或透明代理入站的监听地址与端口。
  • DNS 服务器、域名匹配规则、缓存策略和查询路径。
  • 日志级别、统计策略及仅对特定核心版本有效的扩展项。

从订阅到分享链接的转换步骤

可靠转换应采用分层流程,而不是对文本反复尝试解码。先保留原始响应副本,记录内容类型与字符编码,再判断外层。解析成功后建立统一的节点字段模型,最后由不同输出器生成 VMess、VLESS 链接或核心 JSON。这样更容易定位是获取、解码、字段解析还是输出阶段发生错误。
  1. 检查响应

    确认请求返回 HTTP 200,内容不是登录页或错误页。记录响应是否包含换行、JSON 起始符或可识别协议头。
  2. 解开外层

    仅在内容符合编码订阅特征时执行一次 base64 解码。兼容标准字符表与 URL 安全字符表,并以 UTF-8 读取结果。
  3. 拆分节点

    按 CRLF 或 LF 分行,去除空白行。每行依据 vmess://vless://trojan:// 分派解析器。
  4. 规范字段

    把端口转换为整数,统一传输名称,分别保存地址、用户标识、TLS、SNI、路径与备注,未知字段单独保留。
  5. 导入并验证

    在 v2rayN 打开「设置」→「参数设置」→「Core 类型」确认所选核心支持目标协议,再导入新分组并查看核心日志。
验证不能只看“导入成功”。导入成功只代表语法被客户端接受。还应检查节点详情中的服务器、端口和传输参数,启动后查看日志是否出现 DNS 失败、TLS 名称不匹配、路径错误或端口占用。若本地端口使用 10808,还要确认没有另一进程占用同一监听端口。

适合自动化的检查项

  1. 订阅响应大小是否合理,空响应直接停止解析。
  2. 解码结果是否为有效 UTF-8,异常字节是否来自错误字符集。
  3. 每个节点的端口是否位于 1 至 65535。
  4. 启用 TLS 时是否保留 SNI 或对应服务器名称。
  5. WebSocket 路径是否以斜杠开头,查询参数是否被重复编码。
  6. 节点备注是否经过 URL 解码,同时避免备注覆盖连接字段。

在 v2rayN、v2rayNG 与 v2flyNG 中导入

v2rayN 适合在桌面环境管理订阅分组。添加订阅地址后执行更新,客户端会获取并解析节点列表。若只拿到单条分享链接,可以使用从剪贴板导入的入口。不同版本的菜单文字可能略有调整,但操作顺序仍是先建立订阅分组,再更新该分组,最后选择节点并启用系统代理。
v2rayNG 使用 Xray 内核,v2flyNG 使用 V2Fly 内核。两者都能处理常见 VMess 订阅与分享链接,但特定协议扩展是否可用取决于内核支持。遇到链接能够解析、启动时却提示未知传输或未知安全类型,应检查链接需要的内核能力,而不是继续修改 base64 内容。

订阅地址粘贴后没有节点?

先在浏览器之外检查客户端日志中的 HTTP 状态。若返回 200,再确认解码结果是否包含逐行排列的协议头;若返回的是 JSON 对象,需要使用对应导入方式。

为什么解码一次还是乱码?

检查文本是否采用 URL 安全 base64,并补齐末尾等号。仍失败时查看响应是否混入提示文字、UTF-8 字节顺序标记或 HTML 错误内容。

节点导入成功却连接失败?

逐项核对端口、传输方式、TLS、SNI 和路径,再查看核心日志。WebSocket 路径少一个斜杠或 SNI 被遗漏,都可能让握手在数秒内失败。

更新订阅会覆盖手工备注吗?

多数客户端会按订阅返回内容重建该分组,手工修改的名称可能被替换。需要长期保留的节点应复制到独立分组,并记录原订阅归属。

原生 JSON 能直接导入订阅框吗?

通常不能。订阅框期待网络地址或节点列表,核心 JSON 应使用客户端提供的自定义配置入口,并单独检查入站端口、路由与 DNS 设置。
在 v2rayN 中排查内核选择时,可进入「设置」→「参数设置」→「Core 类型」查看当前设置。订阅更新后若列表未变化,先确认更新的是正确分组,再查看日志时间戳。移动端导入前应检查剪贴板内容是否完整,长链接被聊天工具截断时,末尾备注看似存在,中间查询参数却可能已经缺失。

导入后的四项验证

  • 字段验证: 节点详情中的服务器、端口、传输方式与原始内容一致。
  • 核心验证: 所选内核支持链接声明的协议和传输扩展。
  • 日志验证: 启动后没有端口占用、DNS 解析或 TLS 握手错误。
  • 分组验证: 手工节点与订阅节点分开保存,下一次更新不会覆盖需要保留的配置。

转换边界与维护建议

订阅转换的目标应是保持连接参数一致,而不是制造表面上相似的链接。遇到工具不认识的字段时,保留原始数据并明确提示,比删除字段后继续输出更可靠。尤其是传输层扩展和安全参数,缺失后仍可能生成语法正确的链接,但连接结果已经不同。
订阅地址本身通常承担更新入口的作用。把一次获取到的节点导出为静态分享链接后,它不会自动获得后续的服务器、端口或用户信息变更。长期使用时应保留原订阅分组,静态链接更适合作为临时迁移或参数分析材料。
原生 JSON 则适合保存经过验证的路由和入站设置。修改前记录当前本地监听端口、系统代理状态、核心类型和配置文件来源。出现问题时先恢复这些基础项,再检查节点字段,可以避免把系统代理问题误判为订阅格式问题。
目标 建议输入 建议输出 必须复核
定期更新多个节点 订阅地址 客户端订阅分组 更新状态、分组归属、协议支持
迁移一个节点 单条分享链接 新建节点 TLS、SNI、路径、备注
维护精细路由 原生 JSON 独立核心配置 入站端口、DNS、路由标签
分析订阅内容 原始响应 解码后的只读副本 只解码一层、避免公开连接信息
最稳妥的工作方式是保留三份材料:未经修改的订阅响应、规范化后的节点字段、最终导入文件。三者分开后,任何连接异常都能追溯到具体转换阶段。对于普通使用者,优先让客户端直接管理订阅;只有在迁移、调试或构建自定义路由时,才需要手工处理编码和 JSON 映射。
下载 V2Ray 客户端 Windows、macOS、Android、Linux