本文速览
本文适合正在排查订阅导入失败、需要迁移节点或想理解配置结构的用户。核心判断顺序是先识别响应内容,再区分节点分享信息与完整运行配置,最后按字段能力做转换;读完可以独立判断一段文本属于 base64 聚合订阅、原生 JSON,还是 VMess、VLESS、Trojan、Shadowsocks 分享链接。
先判断拿到的是哪一种格式
“订阅”不是单一文件规范,而是一种分发方式。客户端访问订阅地址后,服务器可能返回经过 base64 编码的多行分享链接,也可能直接返回逐行文本、JSON 节点列表,甚至返回一个面向特定客户端定义的配置对象。地址以
https:// 开头只能说明传输方式,不能说明响应正文的结构。单条分享链接描述一个出站节点,常见前缀包括
vmess://、vless://、trojan:// 和 ss://。它通常包含服务器地址、端口、认证信息、传输方式和 TLS 参数。聚合订阅则把多条分享链接放进同一份响应,客户端更新时重新下载并覆盖对应订阅分组。原生 JSON 配置的范围更大。它可以同时包含
inbounds、outbounds、routing、dns 和 log,因此不仅描述远端节点,还能指定本地监听端口、路由规则和 DNS 行为。把完整 JSON 当作一条普通订阅导入,客户端未必会接受。3 类
聚合订阅、原生 JSON、分享链接
4 前缀
VMess、VLESS、Trojan、Shadowsocks
36 字符
带连字符的标准 UUID 长度
10808
常见本地 SOCKS 监听端口
| 观察到的内容 | 更可能的格式 | 适合的导入入口 |
|---|---|---|
| 长段字母、数字,并可能以一个或两个等号结尾 | base64 聚合订阅 | 订阅分组或订阅设置 |
| 以花括号开始,含 inbounds、outbounds | 原生 JSON 配置 | 自定义配置或内核配置入口 |
| 以 vmess://、vless:// 等前缀开始 | 单条分享链接 | 从剪贴板导入或扫描二维码 |
| 多行内容,每行都是协议前缀 | 未整体编码的聚合列表 | 取决于客户端订阅解析能力 |
结论:先看正文,不要根据网址后缀猜格式
订阅地址即使以
.json 结尾,也可能返回 base64 文本;没有文件后缀的接口也可能返回 JSON。排查时应查看实际响应的前几十个字符、HTTP 状态和响应类型,再决定使用哪个导入入口。base64 聚合订阅如何拆开
最常见的传统订阅结构,是先把若干条分享链接用换行符连接,再对整段文本进行一次 base64 编码。base64 只是字符编码,不负责加密,也不验证字段是否正确。解码成功仅表示字符层面可还原,不代表里面的每个节点都能被当前内核识别。
标准 base64 字符表包含大小写字母、数字、加号和斜杠,末尾可能使用等号补齐。部分服务使用 URL-safe 变体,把加号替换为减号、斜杠替换为下划线,并省略末尾补位。客户端若只接受标准字符表,就可能出现“订阅内容为空”或“格式无效”。
编码前的聚合内容示意:
vmess://eyJ2IjoiMiIsInBzIjoiV00tMDEiLCJhZGQiOiJleGFtcGxlLmNvbSJ9
vless://[email protected]:443?encryption=none&security=tls&type=ws&path=%2Fedge#VL-01
trojan://[email protected]:443?security=tls&sni=example.com#TR-01
处理顺序:
HTTP 响应正文 → 去除首尾空白 → 整体 base64 解码 → 按换行拆分 → 逐条解析协议链接
- 检查空白字符:正文前面的 UTF-8 BOM、复制时混入的空格以及多余空行,都可能影响严格解析器。
- 检查补位:base64 长度通常需要能按 4 分组;缺失补位时,可由解析器按余数补充,但不能随意删除中间字符。
- 检查换行:服务端可能使用 LF 或 CRLF。稳妥的拆分方式应同时处理两种换行,并过滤空行。
- 检查二次编码:若第一次解码后仍是一整段明显的 base64 字符,不要立即认定必须再次解码,应先确认服务端是否套了额外封装。
VMess 分享链接本身又经常采用“前缀加 base64 JSON”的结构,因此聚合订阅可能形成两层编码:外层用于包装节点列表,内层属于 VMess 分享格式。外层解码后应停在逐行链接阶段,再把每条
vmess:// 后面的内容单独解码。VLESS 与 Trojan 通常采用 URI 查询参数,不需要再把整条链接做 base64 解码。原生 JSON 为什么不能等同于节点列表
原生 V2Ray 或 Xray JSON 是内核运行配置。它描述数据从哪个本地入口进入、匹配哪些路由规则、交给哪个出站连接,以及域名如何解析。一个出站节点只是
outbounds 数组中的一项;完整配置还可能存在 direct、block 等多个出站标签。下面的缩减示例展示了结构层级。监听在
127.0.0.1:10808 的 SOCKS 入站接收本机流量,名为 proxy 的 VLESS 出站连接到远端 443 端口。实际使用时,传输层、TLS 或 REALITY 参数还会放在 streamSettings 中。{
"inbounds": [
{
"listen": "127.0.0.1",
"port": 10808,
"protocol": "socks",
"settings": {
"udp": true
}
}
],
"outbounds": [
{
"tag": "proxy",
"protocol": "vless",
"settings": {
"vnext": [
{
"address": "example.com",
"port": 443,
"users": [
{
"id": "11111111-1111-4111-8111-111111111111",
"encryption": "none"
}
]
}
]
}
}
]
}
分享链接或订阅
推荐由客户端生成本地入站、日志和基础路由,节点只提供远端连接字段,迁移成本较低。
适合:在 v2rayN、v2rayNG、v2flyNG 中管理日常节点
原生 JSON
可以完整控制入站、出站、DNS、路由和策略,但不同内核支持的字段集合可能不同。
适合:需要自定义路由链路或精确内核行为
客户端备份
除节点外还可能保存订阅分组、界面选项和本地数据库信息,通常仅适合同款客户端恢复。
适合:同一客户端版本间迁移设置
从 JSON 提取分享链接时,不能只复制
address、port 和 id。还要读取 streamSettings.network、security、WebSocket 路径、HTTP Host、gRPC serviceName、TLS serverName,以及 REALITY 的 publicKey、shortId 和 fingerprint。漏掉其中任意关键字段,都可能得到语法正确但握手失败的链接。反向转换也会丢失信息。单条分享链接通常无法完整承载复杂的
routing.rules、DNS hosts 映射、多个入站端口、负载均衡器或链式代理。导入分享链接后,客户端会按自身模板重新生成这些本地部分,而不是还原原 JSON 的全部行为。结论:转换时以远端出站为边界
需要跨客户端迁移节点时,只转换服务器出站所需字段;需要保留 DNS、路由分流和多个入站时,应迁移原生 JSON,并确认目标内核支持其中每个配置段。
VMess、VLESS 与其他分享链接的字段差异
VMess 常见分享格式把一个 JSON 对象编码后接在
vmess:// 后面。常见字段包括版本 v、备注 ps、地址 add、端口 port、用户标识 id、额外 ID aid、加密方式 scy、传输网络 net、伪装类型 type、Host、路径、TLS、SNI、ALPN 和指纹。该格式由客户端生态长期扩展,部分新增字段在旧版本客户端中可能被忽略。VLESS 更接近标准 URI:用户信息位置放 UUID,主机与端口放服务器地址,查询参数描述传输和安全层,井号后的片段是节点备注。VLESS 的
encryption 通常为 none;这不是 TLS 开关,TLS、REALITY 等安全方式由 security 参数表达。| 分享字段 | 含义 | 常见错误 |
|---|---|---|
| address / add | 远端服务器域名或 IP | 复制时混入协议前缀或路径 |
| port | 远端监听端口,如 443 | 误填成本地 10808 端口 |
| id | VMess 或 VLESS 用户 UUID | 缺字符、带空格或使用错误用户 |
| type | 传输类型,如 tcp、ws、grpc | 与服务端传输不一致 |
| security | 传输安全方式,如 tls、reality、none | 与协议自身加密字段混淆 |
| sni / serverName | TLS 握手使用的服务器名称 | 填写 IP 或漏填服务端要求的域名 |
| path | WebSocket HTTP 路径 | 斜杠或百分号解码层级错误 |
| flow | VLESS 流控方式,如 xtls-rprx-vision | 普通 TLS 节点误设 Vision |
| pbk / sid | REALITY 公钥与 shortId | 把服务端私有参数写入客户端字段 |
VLESS 链接结构示意:
vless://UUID@服务器:端口
?encryption=none
&security=reality
&type=tcp
&sni=握手域名
&fp=chrome
&pbk=REALITY公钥
&sid=shortId
&flow=xtls-rprx-vision
#节点备注
Trojan 链接把密码放在用户信息位置,后面同样可以携带
security、sni、type、path 等查询参数。Shadowsocks 分享链接则主要表达加密方法、密码、地址和端口,扩展传输参数的兼容程度依赖具体格式。转换工具若只识别基本字段,可能保留节点认证,却丢失插件或传输配置。URI 中的节点备注、路径和 Host 可能经过百分号编码。例如空格可表示为
%20,斜杠在查询参数中可能表示为 %2F。正确处理方式是按 URI 规则解析每个组成部分,而不是对整条链接反复执行字符串替换。过早解码井号、问号或连接符,可能改变字段边界。三种格式相互转换的稳妥流程
转换的第一目标应是保留连接所需字段,而不是追求文本外观一致。先确定源格式,再建立统一的节点数据模型,至少记录协议、地址、端口、认证、传输、安全层和备注。最后由目标客户端或生成器按目标格式输出。
识别源内容
查看响应开头、协议前缀和 JSON 顶层键。若是订阅网址,先确认 HTTP 状态为 200,并判断响应是否需要整体 base64 解码。拆分节点
对聚合订阅按 LF 或 CRLF 分行,过滤空行;对每条链接按协议前缀选择对应解析器,不要把 VLESS 参数套用到 VMess。归一字段
统一保存服务器、端口、用户标识、传输类型、TLS 或 REALITY 参数,并分别保留 WebSocket path、gRPC serviceName 与 SNI。核对内核
在 v2rayN 中检查「设置」→「参数设置」→「Core 类型」,确认所选内核支持节点使用的协议、REALITY 或 XTLS Vision 字段。导入并测试
先只导入一条节点,查看核心日志是否出现 unknown field、failed to find an available destination 或 TLS handshake 等信息,再批量转换。
在 v2rayN 中,订阅通常放入订阅分组,再执行更新全部订阅;单条分享链接更适合通过剪贴板导入。若需要载入完整 JSON,应使用客户端提供的自定义配置能力,而不是把 JSON 文件的网址直接放进普通订阅地址栏。导入后还需选择活动服务器并启用系统代理或所需的 TUN 模式。
在 v2rayNG 与 v2flyNG 中,订阅设置负责保存远程地址和更新结果,剪贴板导入负责处理单条分享链接。v2rayNG 使用 Xray 内核,v2flyNG 使用 v2fly 内核;两者对常规 VMess、VLESS、Trojan、Shadowsocks 的支持范围以及对较新传输字段的接受程度并不完全相同。迁移后应进入节点详情逐项核对,而不是只看节点名称是否出现。
结论:先转换一条,再处理整个订阅
用单节点完成导入、启动内核和实际连接三项验证,可以快速发现字段映射问题。若直接转换数十条节点,节点重名、部分协议不兼容和日志交叉会增加排查成本。
订阅导入后为空的排查顺序
导入后列表为空,不等于订阅中没有节点。问题可能发生在网络请求、响应解码、逐行识别、协议兼容或分组显示任一阶段。有效排查应从最靠前的环节开始,避免反复删除客户端配置。
先确认订阅请求确实返回正文,而不是登录页面、限流提示或 HTML 错误页。一个页面即使返回 200,也可能因为访问令牌失效而输出提示文本。响应以
<html、<!doctype 开始时,base64 解码和协议解析自然不会产生节点。订阅更新提示超时怎么办?
先确认设备能访问订阅域名。若直连路径不可用,可连接一条现有可用节点,再到订阅设置中启用通过代理更新;同时检查系统时间和订阅地址是否被复制完整。
更新成功但节点列表为空?
查看更新日志中的新增数量,并检查响应解码后是否出现
vmess://、vless:// 等前缀。若只看到 JSON,确认它是节点数组还是包含 inbounds、outbounds 的完整内核配置。只有部分节点被导入?
按未导入节点的协议和传输类型分类,重点检查 URL-safe base64、REALITY 参数、gRPC serviceName 以及备注中的特殊字符。旧客户端可能跳过无法识别的字段或整条记录。
节点存在但启动内核失败?
在 v2rayN 打开「设置」→「参数设置」→「Core 类型」核对内核,再查看核心日志中的首条错误。端口占用时检查本地 10808 等监听端口,字段错误时回到节点编辑页核对传输与安全层。
更新后手动修改被覆盖?
订阅节点通常由远程内容管理,再次更新可能覆盖本地字段。需要长期保留修改时,将节点复制到独立分组,或从源订阅修正对应参数,不要只修改订阅分组中的临时副本。
- 请求层:检查状态码、重定向、响应长度和访问令牌是否有效。
- 编码层:确认标准 base64、URL-safe base64、补位和 UTF-8 文本是否被正确处理。
- 结构层:确认解码结果是逐行分享链接、节点数组,还是完整内核配置。
- 协议层:核对 VMess、VLESS、Trojan、Shadowsocks 前缀及必需字段。
- 内核层:确认 Xray 或 v2fly 内核支持所用安全方式、传输方式和 flow。
- 运行层:检查本地端口占用、系统代理、TUN 模式、路由分流和核心日志。
如果订阅可以解码、分享链接也能单独导入,但批量更新仍然为空,常见原因是响应格式与客户端订阅解析器的预期不同。例如服务端直接返回 JSON 数组,而客户端只按 base64 多行链接处理。此时应调整订阅输出格式,或选择明确支持该 JSON 结构的导入方式。
如果节点能导入但连接失败,应停止继续研究 base64。此时编码阶段已经完成,问题更可能位于地址、端口、UUID、密码、SNI、WebSocket path、gRPC serviceName、REALITY publicKey、shortId 或 flow。按核心日志的第一处握手错误逐项核对,比重复更新订阅更有效。
格式选择与长期维护建议
日常在 v2rayN、v2rayNG 或 v2flyNG 中维护多个节点时,订阅加分享链接的组合更便于更新。客户端负责生成本地入站、系统代理和基础路由,订阅源只维护远端节点。需要调整某个节点时,应优先在订阅源修正,避免下次更新覆盖本地修改。
需要复杂 DNS、按域名或 IP 路由、多个入站端口、链式出站时,原生 JSON 更合适。此类配置应记录目标内核及支持版本,并在切换 Core 类型后重新检查字段。Xray 与 v2fly 的配置结构有大量相同部分,但 REALITY、XTLS Vision 和部分扩展能力不能仅凭字段名称推断兼容。
| 使用目标 | 建议格式 | 维护重点 |
|---|---|---|
| 多节点定期更新 | 聚合订阅 | 分组、更新时间、响应格式 |
| 临时发送一个节点 | 分享链接 | 协议字段、URI 编码、备注 |
| 精确控制路由与 DNS | 原生 JSON | 内核兼容、配置层级、出站标签 |
| 跨客户端迁移 | 标准分享字段 | 先单节点验证,再批量生成 |
保存配置时还应区分“节点数据”和“客户端状态”。节点数据包括地址、端口、认证与传输参数;客户端状态包括当前选中节点、订阅分组、系统代理模式、TUN 设置和路由规则。只导出分享链接不会带走后者,这是格式边界,并非导出失败。
最终可用一条简单规则做选择:需要自动更新一组节点,用订阅;需要传递一个节点,用分享链接;需要复现完整内核运行行为,用原生 JSON。发生转换时,先列出目标格式无法表达的字段,再决定接受丢失、改由客户端重建,还是保留原配置。