先分清订阅地址、订阅响应、单节点分享链接和内核配置,再选择导入入口。本文适合遇到“订阅内容无法识别”“JSON 不能当节点导入”或需要跨设备迁移的用户:按步骤识别 Base64 外层,理解 VMess 与 VLESS 的字段差异,并确认转换时哪些连接参数能保留、哪些 DNS 与路由设置必须另行迁移。
一、识别格式:订阅地址不等于节点配置
V2Ray 订阅并不是一种固定的内核配置文件。日常所说的“订阅链接”通常是一个 HTTPS 地址,客户端访问它后取得文本,再解析为节点列表。返回内容可能是逐行排列的分享链接,也可能把整份链接列表做一次 Base64 编码。能打开地址,只说明取得了响应,不代表响应一定适合当前客户端。
| 对象 | 识别方式 | 适用入口 | 保存范围 |
|---|---|---|---|
| 订阅地址 | 以 https:// 开头的服务地址 | 订阅分组设置 | 远程更新来源 |
| Base64 订阅正文 | 解码后通常是多行分享链接 | 由订阅更新器解析 | 多条节点参数 |
| VMess 分享链接 | vmess:// 加编码数据 | 从剪贴板导入 | 通常为一个节点 |
| VLESS 分享链接 | vless:// 加用户信息和查询参数 | 从剪贴板导入 | 通常为一个节点 |
| 内核 JSON | 含 inbounds、outbounds 等字段 | 自定义配置入口 | 连接、入口、DNS、路由等设置 |
例如,https://subscription.example.com/list?token=demo 是地址形态示例,不是可用订阅。不能把它当作 VLESS 服务器地址填写;也不能把一段原生 JSON 粘到订阅地址框里。订阅地址中的令牌往往关联账号权限,排错时应遮盖完整路径与查询参数,而不只是隐藏域名。
二、拆开 Base64:区分订阅外层与 VMess 内层
常见的 Base64 订阅有两层结构:外层把整份链接列表编码,内层的每条 vmess:// 链接又可能包含一份 Base64 编码的 JSON。解开外层只会得到节点链接,不会直接得到完整的内核运行配置。VLESS 则通常直接使用 URI 结构,不能照搬 VMess 的内层解码方法。
订阅响应正文
↓ 对整段正文做 Base64 解码
vmess://一段编码后的节点JSON
vless://用户标识@服务器:端口?参数#备注
↓ 仅对 vmess:// 后面的载荷继续解码
VMess 节点字段:add、port、id、net、tls 等
先查看响应的实际文本,再决定是否解码。若正文已经以 vmess:// 或 vless:// 开头,就按逐行链接处理;若开头是 HTML 标签、登录提示或 JSON 错误信息,问题多半在订阅请求、授权或服务端返回内容,反复解码并不能修复。
- 换行:一行保存一条完整链接。复制时不要在链接中间插入换行,也不要把多条链接直接拼成一行。
- 字符:Base64URL 使用
-、_替代常规 Base64 的+、/,有的输出会省略末尾=。 - 文字:中文备注应按 UTF-8 还原,直接把二进制结果当普通字符显示,可能出现乱码。
- 次数:已经得到链接列表后就停止外层解码;不能因为看到字母数字混合就继续重复处理。
下面是可在本地空白页面的浏览器开发者工具中使用的原生 JavaScript 函数。它只演示文本编码与解码,不发起网络请求,也不自动读取剪贴板。仅用示例文本验证往返结果;处理真实订阅时还应注意浏览器扩展与控制台记录。
function encodeUtf8Base64(text) {
const bytes = new TextEncoder().encode(text);
let binary = "";
for (const byte of bytes) binary += String.fromCharCode(byte);
return btoa(binary);
}
function decodeUtf8Base64(text) {
let value = text.trim().replace(/\s+/g, "")
.replace(/-/g, "+").replace(/_/g, "/");
if (value.length % 4 === 1) {
throw new Error("Base64 长度异常,请检查复制内容");
}
value += "=".repeat((4 - value.length % 4) % 4);
const bytes = Uint8Array.from(atob(value), ch => ch.charCodeAt(0));
return new TextDecoder("utf-8", { fatal: true }).decode(bytes);
}
const sample = "订阅格式示例";
console.log(decodeUtf8Base64(encodeUtf8Base64(sample)) === sample);
三、核对节点字段:VMess JSON 与 VLESS URI
常见 VMess 分享格式在 vmess:// 后保存编码后的节点描述 JSON。这是客户端约定的分享结构,不等同于 Xray 或 V2Ray 内核 JSON。下面的 v 为分享格式标识;v: "2" 不是客户端版本号,也不是要求安装某个版本的内核。
{
"v": "2",
"ps": "VMess-WS-TLS 示例",
"add": "node.example.com",
"port": "443",
"id": "11111111-2222-4333-8444-555555555555",
"aid": "0",
"scy": "auto",
"net": "ws",
"type": "none",
"host": "edge.example.com",
"path": "/ws",
"tls": "tls",
"sni": "edge.example.com"
}
将上面 JSON 的完整文本按 UTF-8 编码为 Base64,再在前面加上 vmess://,即可构造这种分享格式。示例域名与用户标识仅用于讲解,不能连接。真实节点中的地址、UUID、传输方式和 TLS 设置必须与服务端对应,不能只替换备注就使用。
VMess + WS + TLS
- 服务器端口
443- 传输字段
net: ws- 请求路径
/ws- HTTP Host
edge.example.com- TLS SNI
edge.example.com
Host 属于 WebSocket 请求,SNI 属于 TLS 握手;示例中相同,不代表二者可以互相代替。
VLESS + TCP + TLS
- 服务器端口
443- 传输参数
type=tcp- 协议参数
encryption=none- 传输安全
security=tls- TLS SNI
node.example.com
VLESS 的协议加密字段与 TLS 是不同层级;不能据此把 TLS 设置删掉。
对应的 VLESS 示例采用用户信息、地址、查询参数与片段备注的组合。遇到空格或中文备注,应做 URI 百分号编码;IPv6 地址应放在方括号中。参数顺序通常不影响含义,但参数名和值不能任意改写。
vless://[email protected]:443?encryption=none&security=tls&sni=node.example.com&type=tcp#VLESS-TLS
四、导入 v2rayN:先建订阅分组,再更新节点
远程订阅应放进订阅分组,单条或多条分享链接则使用剪贴板导入。下列路径按 v2rayN 常见中文界面说明;桌面版与 WPF 版的入口位置可能不同,更新操作也可能位于分组的右键菜单。以实际菜单中的同名功能为准,不要因为按钮位置变化就改用自定义配置入口。
-
新建分组
打开「订阅分组」→「订阅分组设置」,新增一条记录。填写备注,把完整 HTTPS 订阅地址粘贴到地址栏,再保存。
-
更新订阅
返回「订阅分组」,选择「更新全部订阅(不通过代理)」。若当前网络必须借助已可用代理才能访问订阅,再选择相应的通过代理更新项。
-
核对节点
查看更新结果,确认目标分组内出现节点。打开一个节点的编辑窗口,核对协议、服务器地址、端口、传输与 TLS,不以备注是否相同作为唯一判断。
-
选择服务器
在节点列表右键选择「设为活动服务器」。订阅更新只取得配置,不等于当前连接已经切换到新节点。
-
验证连接
运行客户端提供的连接测试,再让浏览器实际访问需要验证的站点。若失败,先检查日志里的握手、认证或解析错误,不要立即重复转换格式。
导入静态分享链接时,复制包含前缀的完整链接,使用「服务器」→「从剪贴板导入批量 URL」,常见快捷键为 Ctrl+V。批量文本保持每行一条。只有 Base64 正文而没有远程地址时,先在本地还原链接列表,再使用这个入口更容易定位错误。
- 再次更新会覆盖:订阅节点由远端维护,手工修改可能在后续更新中被替换。需要长期保留的修改应另存独立记录。
- 本地入口别照抄:示例配置常使用
127.0.0.1:10808,实际监听端口应在当前客户端设置中确认,不能由订阅节点的443推断。 - JSON 走专用入口:完整内核配置使用「服务器」中的添加自定义配置功能;它与普通节点记录的编辑、导出能力可能不同。
五、导入 v2rayNG:保留更新来源,区分静态复制
v2rayNG 是安卓端使用 Xray 内核的客户端。常见界面中,远程订阅在右上角菜单管理,静态链接从主界面加号导入。两种方式最终都能显示节点,但只有前者保留订阅来源;把桌面端导出的分享链接复制过来,并不会自动继承桌面端的更新计划或分组关系。
-
添加来源
打开右上角「⋮」→「订阅分组设置」,点「+」,填写备注与完整订阅 URL,保存后返回主界面。
-
取得节点
打开「⋮」→「更新订阅」。若版本提供当前分组与全部分组两种更新项,选择包含目标订阅的范围,并查看更新提示。
-
导入静态项
若拿到的是分享链接,先复制完整文本,再点主界面「+」→「从剪贴板导入」。不要把订阅网页的登录说明一起复制进去。
-
启动并验证
点选目标节点,启动连接并确认系统的 VPN 授权提示。执行真连接测试,再用实际应用验证访问;单独显示 TCP 延迟不代表代理请求成功。
双端迁移方案:共用来源,分别验证设置
桌面端:v2rayN
- 把原始 HTTPS 地址保存到订阅分组。
- 确认节点所需协议由当前内核支持。
- 单独设置系统代理、DNS 与路由规则。
安卓端:v2rayNG
- 添加相同订阅地址,而非只复制节点备注。
- 更新后核对关键参数与节点是否可用。
- 单独检查 VPN 授权与分应用代理范围。
相同来源便于维护,但返回列表可能随账号、请求条件或服务端策略变化;两端列表与设置不会自动同步。
六、执行互转:先判断哪些信息可以保留
分享链接与 Base64 链接列表之间,通常只是文本包装关系。原生 JSON 与分享链接之间则不是一对一关系:完整配置可能包含多个出站、直连与阻断规则、DNS、入口监听和出站选择逻辑。一条节点链接通常只能表达其中某个代理出站的连接参数,不能代替整份配置备份。
保留原始订阅地址
推荐在两端分别添加同一个远程来源。地址不变时,可以继续接收远端维护的节点变更;是否允许多设备使用仍以服务方的账号规则为准。
适合:需要持续更新的跨设备使用。
导出节点分享链接
在节点的右键菜单或分享入口中,选择导出分享 URL、复制链接等功能。导入目标端后逐项核对参数,结果是静态节点快照,不包含订阅令牌和自动更新关系。
适合:临时迁移少量节点或核对单个连接参数。
保留完整内核 JSON
使用自定义配置入口迁移,再核对内核兼容性、本地路径、监听地址与端口。不要把客户端运行时生成的配置直接视为可跨平台使用的通用备份。
适合:需要保留多出站、DNS 或复杂路由的配置。
链接列表与 Base64 订阅正文互转
- 收集目标客户端支持的完整分享链接,每行一条,移除聊天记录中的引号、编号和说明文字。
- 把整份文本以 UTF-8 转成 Base64,得到常见的 Base64 订阅正文。反向操作则解码一次,恢复逐行链接。
- 在客户端导入前,先确认首行协议前缀、总行数和中文备注是否正常。编码成功不等于每条节点都能连接。
- 若希望通过 URL 更新,还需要一个实际返回该正文的受控 HTTPS 服务。生成一段 Base64 文本本身不会创建订阅地址。
原生 JSON 与单节点链接互转
从 JSON 提取节点时,先定位 outbounds 中实际的 VMess 或 VLESS 出站,再按所用内核的配置结构读取服务器、用户认证和 streamSettings。不要默认取第一个出站:它可能是直连,也可能是依赖其他出站的链式连接。Xray 与 V2Ray 的配置能力及不同版本的字段并不完全相同。
- 链接转 JSON:优先让客户端导入链接,再由客户端生成运行配置。这样会结合本机入口、DNS 与路由设置,而不是只输出一个孤立的出站片段。
- JSON 转链接:仅在能够独立表达该出站参数时导出。若导入的是自定义配置,客户端未必提供通用的单节点分享功能。
- 不能承载的部分:入口监听、域名分流、DNS 策略、规则顺序与链式出站关系通常不会随普通分享链接迁移。
- 转换后复核:比较地址、端口、UUID、传输、路径、Host、SNI、TLS 或 REALITY 参数,再做连接测试。
七、排查导入失败:按响应、解析、连接三层处理
先确定失败发生在哪一层。更新订阅报错可能是请求根本没有成功;显示“导入零条”可能是文本格式不受支持;节点已经出现却无法访问,则要检查连接参数与代理生效范围。把这三类问题混在一起,会导致反复编码、切换内核,却没有修正真正的错误。
| 现象 | 优先检查 | 处理动作 |
|---|---|---|
| 更新返回 401 或 403 | 订阅令牌、授权状态与访问条件 | 从服务方重新取得有效地址,不修改 Base64 内容 |
| 正文以 HTML 开头 | 登录页、跳转页或请求拦截页 | 检查最终响应与订阅入口,不能把页面源码当节点 |
| Base64 解码失败 | 复制截断、字符变体与补位 | 确认全文、规范化 Base64URL,再按 UTF-8 解码 |
| 成功更新但导入零条 | 返回内容是否为支持的链接列表 | 检查解码后的协议前缀,确认服务端输出格式 |
| 节点存在但握手失败 | TLS、SNI、系统时间与传输参数 | 回到节点字段逐项比较,不把格式问题与连接问题混淆 |
| 连接可用但部分应用无效 | 系统代理、VPN 与分应用规则 | 检查本地接管范围,不重新编码订阅 |
为什么订阅更新后节点数量和之前不同?
服务端可能调整节点,客户端也可能过滤不支持或重复的条目。先看更新日志与返回文本的实际结构,再对照协议支持情况。不要只凭数量不同就认定转换丢失,更不要手工把旧节点重新追加进自动维护的订阅分组。
JSON 能解析成功,为什么客户端仍然拒绝?
合法 JSON 只代表语法正确。VMess 分享 JSON、订阅接口的 JSON 错误响应和内核配置都可能通过语法解析,但用途不同。还需要确认配置结构、协议能力与入口类型;原生配置应通过自定义配置入口检查。
只备份分享链接,能否恢复 DNS 和路由分流?
通常不能。分享链接主要保存节点连接参数。迁移前还应记录客户端的 DNS、系统代理、路由模式与自定义规则;完整配置另行保存。完成导入后,先用单个节点验证连接,再恢复分流设置,便于区分节点问题和规则问题。