V2Ray 订阅格式对照:Base64 订阅、原生 JSON 配置与分享链接互转

对比 Base64 订阅、原生 JSON 配置和 vmess://、vless:// 分享链接的结构差异,说明各客户端的兼容情况与互相转换的思路。

本文速览

订阅地址负责更新,Base64 负责包装文本,分享链接描述单个节点,原生 JSON 则描述内核运行配置。本文适合遇到“能获取订阅却导不进去”“JSON 转链接后分流丢失”的用户:先识别输入格式,再检查协议、传输和安全字段,最后用客户端完成导入与验证,避免把编码转换误当成配置转换。

一、订阅地址、响应内容与节点格式

“V2Ray 订阅”不是一种由所有客户端统一实现的文件标准。日常说的订阅通常是一个 HTTPS 地址,客户端请求这个地址,取得若干节点,再存进订阅分组。地址可能带有访问令牌;真正决定能否导入的,是服务器返回的内容和客户端支持的解析方式。

输入类型常见结构包含范围使用入口
订阅地址HTTPS URL获取内容的位置与访问凭据订阅分组设置
Base64 订阅编码后的一整段文本通常是逐行排列的分享链接订阅更新或支持该格式的导入器
分享链接vmess://、vless://单个节点的连接参数剪贴板或二维码导入
原生 JSONinbounds、outbounds 等对象入站、出站及可选的 DNS、路由自定义配置入口或直接交给对应内核

有些订阅直接返回明文链接列表,有些会根据请求参数或客户端标识返回不同格式。因此,“后缀是 JSON”或“浏览器里是一串乱码”都不足以判断兼容性。应检查实际响应,而不是只看地址名称。返回登录页面、过期提示或错误 JSON 时,重新编码也不能得到有效节点。

二、Base64 订阅与 VMess 的两层包装

常见 Base64 订阅的制作顺序是:把多个分享链接用换行分隔,将整段 UTF-8 文本编码为 Base64,再作为响应正文返回。客户端解开外层后,才逐行解析每个节点。不能只把一段 Base64 文本前面加上 vmess://,那会把整个列表误当成一个 VMess 节点。

  1. 获取响应正文,先排除 HTML 页面、权限错误与空内容。
  2. 若正文已经以协议前缀逐行排列,直接按明文链接列表处理。
  3. 若正文是 Base64,解码外层,确认结果是可识别的分享链接。
  4. 逐行解析节点;遇到 vmess:// 时,按其约定继续解码内部负载。

广泛使用的 VMess 分享格式是 vmess:// 加一段 Base64 编码的 JSON。这里的 JSON 是分享格式字段,不是 V2Fly 或 Xray 的完整配置。下面展示的是一个 VMess 链接内部解码后的对象,v 的值 2 表示该分享格式的版本标记,不是内核版本。

{
  "v": "2",
  "ps": "教学节点",
  "add": "example.com",
  "port": "443",
  "id": "0f3a10d2-7f3b-4b58-a3f6-9a6fcbec8431",
  "aid": "0",
  "scy": "auto",
  "net": "ws",
  "type": "none",
  "host": "example.com",
  "path": "/ws",
  "tls": "tls",
  "sni": "example.com"
}

示例域名、UUID 与路径仅用于结构说明,不能直接连接。aid: "0" 对应现代 VMess AEAD 的常用设置,不应照搬旧教程把它改成 64。scy 是 VMess 内容加密选项,tls 是传输安全选项,两者不是同一个开关。不同生成器对数字、字符串及扩展字段的处理仍可能有差异。

三、VLESS 链接的查询参数与传输字段

常见 VLESS 分享链接更接近普通 URI:UUID 放在用户信息位置,主机与端口放在地址部分,传输、安全、路径等放在查询参数中,备注放在 # 后面。下面是一条 VLESS + WebSocket + TLS 的教学链接,其中 %2Fws 解码后是 /ws。

vless://[email protected]:443?encryption=none&security=tls&type=ws&host=example.com&path=%2Fws&sni=example.com#VLESS-WS-TLS

VMess 分享字段

服务器
add = example.com
远端端口
port = 443
传输与路径
net = ws、path = /ws
内容加密
scy = auto
传输安全
tls = tls、sni = example.com

这些短字段需要映射到内核配置,不能原样作为出站对象使用。

VLESS 查询参数

服务器
example.com:443
传输
type=ws
请求路径
path=%2Fws
协议加密字段
encryption=none
传输安全
security=tls、sni=example.com

VLESS 本身不提供内容加密;此示例的安全传输由 TLS 提供。

URI 参数中的特殊字符必须正确转义。例如路径包含 & 时,应编码成 %26,否则会被解释为下一个参数的分隔符。IPv6 主机要用方括号包围。备注里有中文时使用百分号编码更利于跨客户端传递;只改变备注通常不影响连接,但改变路径、SNI 或 Host 会影响实际握手。

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

原生配置的职责是让内核运行。它可以包含多个入站和出站,以及 DNS、路由、日志设置。下面是一份用于说明层级的 VMess 配置:本地 SOCKS 入站监听 127.0.0.1:10808,远端出站连接 example.com:443。10808 是示例本地端口,不是订阅地址端口,也不是每个客户端都固定使用的值。

{
  "log": {
    "loglevel": "warning"
  },
  "inbounds": [
    {
      "tag": "local-socks",
      "listen": "127.0.0.1",
      "port": 10808,
      "protocol": "socks",
      "settings": {
        "auth": "noauth",
        "udp": true
      }
    }
  ],
  "outbounds": [
    {
      "tag": "proxy",
      "protocol": "vmess",
      "settings": {
        "vnext": [
          {
            "address": "example.com",
            "port": 443,
            "users": [
              {
                "id": "0f3a10d2-7f3b-4b58-a3f6-9a6fcbec8431",
                "alterId": 0,
                "security": "auto"
              }
            ]
          }
        ]
      },
      "streamSettings": {
        "network": "ws",
        "security": "tls",
        "tlsSettings": {
          "serverName": "example.com"
        },
        "wsSettings": {
          "path": "/ws",
          "headers": {
            "Host": "example.com"
          }
        }
      }
    }
  ]
}

这里的 settings.vnext 承载 VMess 服务器参数,streamSettings 承载传输与安全参数。VLESS 使用不同的协议设置结构,不能仅把 protocol 从 vmess 改成 vless。Xray 与 V2Fly 的配置语法存在交集,但扩展能力和字段演进不同;JSON 语法正确并不等于目标内核能够运行。

转换边界:节点迁移与整套配置迁移

只迁移节点
  • 从代理出站提取服务器、端口、UUID。
  • 保留 WebSocket 路径、Host、TLS 的 SNI。
  • 生成目标客户端支持的分享链接。
  • DNS、路由和本地监听端口由目标客户端设置。
迁移完整配置
  • 保留出站标签与路由引用关系。
  • 核对 DNS、入站监听和日志配置。
  • 检查目标内核支持的全部字段。
  • 使用自定义配置入口,并验证实际运行日志。

普通节点分享链接不承载整套 DNS 与路由规则;完整配置转成链接再导回,通常不是无损往返。

五、v2rayN、v2rayNG 与 v2flyNG 的导入边界

客户端负责解析订阅和管理节点,内核负责实际连接。v2rayN 是桌面客户端,可按配置使用受支持的内核;v2rayNG 是使用 Xray 内核的安卓客户端;v2flyNG 是使用 V2Fly 内核的安卓客户端。不能因为三者都能解析 VMess 链接,就推断三者对所有 VLESS、REALITY 或完整 JSON 配置的支持相同。

客户端常用输入原生配置处理重点核对
v2rayN订阅地址、支持的节点分享链接使用自定义配置入口,并匹配内核导入器与所选内核是否都支持节点字段
v2rayNG订阅地址、剪贴板与二维码节点使用版本提供的自定义配置功能Xray 版本及传输、安全参数是否完整
v2flyNG订阅地址、受支持的节点分享链接按当前版本入口处理 V2Fly 配置不要把 Xray 专用配置直接交给 V2Fly

以下步骤以 v2rayN 7.x 中文界面的常见菜单为例;不同小版本的入口文字可能调整。先判断手里的是订阅地址还是节点文本,再选择对应入口,比反复尝试同一个导入按钮更有效。

  1. 识别输入

    HTTPS 订阅地址走订阅分组;以 vmess:// 或 vless:// 开头的文本走节点导入。包含 inbounds、outbounds 的 JSON 先按完整配置处理。

  2. 添加订阅

    在「订阅分组」→「订阅分组设置」中新增分组,填写名称与订阅地址。保存后从「订阅分组」执行更新;根据网络可达性选择通过代理或不通过代理的更新方式。

  3. 导入单节点

    复制完整链接,在「服务器」→「从剪贴板导入批量URL」中导入。多条链接逐行排列。v2rayNG 可在主界面「+」→「从剪贴板导入」执行对应操作。

  4. 核对字段

    打开节点编辑窗口,对照服务器、443 远端端口、UUID、传输、路径、Host 与 SNI。REALITY 节点还需核对公钥、short ID、指纹与 Flow,不只看节点名称。

  5. 验证连接

    选中节点并测试,再检查日志。若日志提示不支持的协议或字段,检查内核;若提示地址、证书或握手错误,检查节点配置。最后再启用所需的系统代理或 TUN 模式。

六、互转方案:保留更新能力还是导出快照

分享链接转 Base64 订阅,本质上是“排列文本再编码”;Base64 订阅转分享链接则是“解码再拆行”。两者只改变外包装,不会把 VMess 变成 VLESS,也不会自动补齐服务端参数。订阅提供方更换节点后,本地导出的文件不会跟着变化。

保留原订阅地址

推荐

目标客户端支持原订阅格式时,直接添加订阅分组。这样可以继续获取服务端维护的节点列表,避免每次更新都重新复制文件。两端更新时间不同,列表仍可能暂时不同。

适合:日常使用、桌面与安卓共用节点来源

导出分享链接快照

只迁移少量节点时,使用客户端提供的分享或导出功能,再在目标端导入。导出后逐项核对传输与安全字段;不认识的扩展参数可能在再次导出时丢失。

适合:单节点迁移、定位某条链接的解析问题

迁移原生 JSON

需要保留路由、DNS、多出站时,应检查完整配置的内核兼容性,而不是先转成分享链接。还要避免本地端口与客户端已有监听冲突。

适合:已有完整配置、需要控制内核运行细节

本地编码示例:先处理 UTF-8 字节

下面是原生 JavaScript 的本地编码与解码函数,可用于理解普通 Base64 的处理过程。它不会请求网络,也不会解析节点或生成原生配置。输入应是已经确认有效的链接列表;不要把生产订阅粘贴进陌生网站的控制台。

function encodeList(text) {
  const bytes = new TextEncoder().encode(text);
  const binary = Array.from(bytes, byte =>
    String.fromCharCode(byte)
  ).join("");
  return btoa(binary);
}

function decodeList(encoded) {
  let normalized = encoded.trim()
    .replace(/\s+/g, "")
    .replace(/-/g, "+")
    .replace(/_/g, "/");
  normalized += "=".repeat((4 - normalized.length % 4) % 4);
  const binary = atob(normalized);
  const bytes = Uint8Array.from(binary, char =>
    char.charCodeAt(0)
  );
  return new TextDecoder("utf-8", { fatal: true }).decode(bytes);
}

七、格式转换与订阅导入常见问题

订阅能打开,为什么客户端显示零个节点?

先在本地检查响应开头。若是 HTML、到期说明或错误对象,处理订阅权限;若是 Base64,解码后检查是否有逐行协议链接。若返回完整 JSON,改用匹配的自定义配置入口,或向提供方索取该客户端支持的订阅格式。

把 JSON 编码后,为什么还是导不进去?

Base64 不会改变内部结构。一个包含 outbounds 的配置对象,编码后仍是配置对象,不会自动变成链接列表。先提取代理出站并映射服务器、用户、传输与安全字段,再由支持这些字段的工具或客户端导出分享链接。

导入成功,为什么连接仍然失败?

导入成功只表示解析器接受了文本。打开节点编辑窗口,对照远端端口、UUID、WebSocket 路径和 SNI;再查看日志是否出现证书、握手或不支持字段的错误。不要把本地 SOCKS 的 10808 填进远端服务器端口。

换设备后,原来的分流规则去哪了?

普通节点链接通常只带节点参数。到目标客户端的路由设置重新配置规则,或者迁移完整且兼容的自定义配置。核对出站标签与路由引用是否一致;只迁移服务器地址和 UUID 不能恢复整套分流。

订阅地址已经发给别人,改备注有用吗?

改节点备注不能撤销访问权限。应在订阅提供方的管理入口重置订阅令牌或地址,再到客户端订阅分组替换旧地址并更新。若节点凭据也已泄露,还需要由服务端管理者更换相应凭据。

最后按三层顺序检查:先确认拿到的响应内容,再确认客户端能否解析,最后确认内核能够连接。记录客户端版本、所选内核、节点传输类型与错误日志,比单纯反复做 Base64 编码更容易定位问题。需要基础设置时,可继续阅读本站快速上手;协议与安全字段可对照协议详解。

下载v2rayN