订阅地址是获取入口,Base64 是文本编码,分享链接描述单个节点,原生 JSON 则可以描述完整的内核运行配置。本文适合遇到“订阅解析失败”“JSON 无法导入”或需要迁移节点的用户:先辨认实际响应,再拆解字段,最后在本地完成转换与连接检查。
一、订阅地址、Base64 与 JSON 不是同一层概念
复制到客户端的订阅地址通常是一条 HTTPS URL。客户端访问它后,才会得到节点列表或配置内容。地址末尾有没有 .json 并不能决定格式;同一个接口也可能根据请求参数或客户端标识返回不同内容。排查时应看实际响应,而不是只看文件名。
常见的 Base64 订阅,是先将多条分享链接按行排列,再把整段 UTF-8 文本做 Base64 编码。它没有把节点变成另一种协议,也没有提供保密能力。拿到内容的人通常可以还原服务器地址与认证信息,因此订阅地址本身应视作凭据保存。
客户端兼容的链接列表订阅
推荐维护多个节点时优先选择。内容可能是明文链接列表,也可能在外层套一层 Base64;客户端解析成功后生成节点条目。
适合:日常更新节点、在多台设备上分别导入
单条 vmess:// 或 vless:// 链接
描述一个连接方案,适合临时传递和逐项排错。它通常不携带整套 DNS、入站和路由规则,也不会自动获取后续变更。
适合:手动导入、对照节点字段、单节点迁移
内核原生 JSON 配置
可以包含 inbounds、outbounds、routing 与 dns。必须确认目标内核及版本支持相应字段,不能直接当作普通节点订阅。
适合:固定部署、自定义路由、需要保留完整运行配置
判断顺序:先识别内容,再选择导入入口
解码后若是逐行分享链接,使用节点或订阅导入;若是带有 inbounds、outbounds 的对象,先按自定义配置检查。不要仅因两者都出现 JSON 就混用导入入口。
二、vmess://:外层 Base64 与内层节点 JSON
常见的 VMess 分享格式为 vmess:// 加上一个 Base64 字符串,解码后是节点描述对象。下面展示解码后的示例。域名和 UUID 仅用于说明结构,不能用于实际连接;v 的值 "2" 是分享格式版本,不是内核版本。
{
"v": "2",
"ps": "示例 VMess WS",
"add": "node.example.net",
"port": "443",
"id": "e7c3a416-5c9e-4f2b-9d81-73d14a9b8620",
"aid": "0",
"scy": "auto",
"net": "ws",
"type": "none",
"host": "node.example.net",
"path": "/gateway",
"tls": "tls",
"sni": "node.example.net"
}
| 字段 | 含义 | 核对重点 |
|---|---|---|
add / port | 连接地址与端口 | 示例为 443;不能把整条 HTTPS URL 填入地址栏。 |
id | 用户 UUID | 应与服务端一致,注意前后空格。 |
aid | 历史 alterId 参数 | 现代部署通常使用 0;不要为了排错任意改成旧值。 |
scy | VMess 内容加密选项 | auto 不等于外层 TLS,二者属于不同层。 |
net / path | 传输方式与路径 | 这里是 WebSocket;/gateway 要与服务端配置对应。 |
host / sni | WebSocket Host 与 TLS 服务器名称 | 二者作用不同,即使示例中相同也不能随意互换。 |
ps | 显示备注 | 改备注不会修复认证失败或握手错误。 |
这里的 JSON 并不是可以直接交给内核运行的配置。它没有完整的 outbounds 层级,字段名也采用了分享格式的简写。转换成原生配置时,需要把 add 映射到服务器地址,把用户信息放进相应协议的用户数组,再分别构建传输和 TLS 设置。
三、vless://:UUID、查询参数与备注的边界
VLESS 分享链接通常采用 URI 结构,而不是把整个 JSON 包进 Base64。下面是一条 VLESS over TCP + TLS 的教学示例;它不使用 REALITY,也没有配置 Vision 流控。
vless://[email protected]:443?encryption=none&security=tls&type=tcp&sni=node.example.net#VLESS%20TLS%20Example
vless://后、@前的部分是 UUID;@后是服务器地址和端口。IPv6 地址写入 URI 时需要方括号。encryption=none表示 VLESS 本身不在这一层进行内容加密;本例仍通过security=tls使用 TLS 保护连接。type=tcp指向传输类型,sni指定 TLS 服务器名称。不同客户端与内核版本对传输名称的展示可能不同。#后是显示备注,%20代表空格。备注不参与服务端认证。flow=xtls-rprx-vision只能在服务端、传输组合及内核均支持时使用;它不是所有 VLESS 链接都应补上的参数。
如果拿到的是 REALITY 节点,还要逐项核对链接中的 security=reality、pbk、sid、fp 与 sni。这些参数不能从 UUID 或服务器地址推算出来,也不能通过“VMess 转 VLESS”自动补齐。客户端最终生成的内核字段应以其对应版本为准。
互转边界:重新编码不等于更换协议
可以把已有分享链接打包成 Base64 订阅,也可以将已知参数整理成 JSON;但把前缀从 vmess 改成 vless 不会让服务端改用 VLESS。协议迁移需要服务端提供对应入站与认证信息。
四、在本地解码与重新编码 Base64 订阅
订阅里可能包含访问令牌和有效 UUID。处理真实内容时,优先使用本地文本工具或空白页面的浏览器开发者工具,不要上传到不明转换网站。下面的函数只转换传入的字符串,不发起网络请求,也不需要粘贴订阅地址。
function decodeBase64Utf8(input) {
let text = input.trim().replace(/\s+/g, "")
.replace(/-/g, "+").replace(/_/g, "/");
text += "=".repeat((4 - text.length % 4) % 4);
const bytes = Uint8Array.from(atob(text), ch => ch.charCodeAt(0));
return new TextDecoder("utf-8", { fatal: true }).decode(bytes);
}
function encodeBase64Utf8(input) {
const bytes = new TextEncoder().encode(input);
let binary = "";
for (const byte of bytes) binary += String.fromCharCode(byte);
return btoa(binary);
}
const demoLink =
"vless://[email protected]:443" +
"?encryption=none&security=tls&type=tcp&sni=node.example.net#Example";
const subscription = encodeBase64Utf8(demoLink + "\n");
console.log(subscription);
console.log(decodeBase64Utf8(subscription));
这段代码兼容常见 Base64URL 字符替换,并补齐结尾填充。UTF-8 的转换是为正确处理中文备注;直接对中文调用 btoa() 可能报错。执行前应读懂代码,真实凭据也不宜保存在公共设备的控制台记录中。
- 得到订阅的响应正文后,先判断是否已经以
vmess://或vless://开头。如果是明文链接,不必再解码外层。 - 如果内容为 Base64,解码一次,再按换行拆分。去掉空行,但不要删除 URI 内部有效字符或改写大小写敏感的路径。
- 对每条
vmess://去掉前缀后,单独调用解码函数,再用JSON.parse()检查其对象结构。 - 要还原成列表订阅,用换行连接完整的分享链接,再调用编码函数。不要编码界面上显示的节点名称。
若响应以 <!DOCTYPE html> 开头,应先检查登录状态、地址是否过期或接口是否返回错误页面。若解码后是合法 JSON,也要继续判断它是错误消息、节点数组还是完整内核配置。Base64 解码成功,只能证明编码可还原,不能证明内容能连接。
五、从分享链接整理为 Xray 原生 JSON
下面把前面的 VLESS TLS 示例整理成最小运行配置,便于观察层级。它绑定本机 127.0.0.1:10808 作为 SOCKS 入站,出站连接到示例域名的 443 端口。该地址没有可用服务,配置仅供字段对照;实际运行前需要换成服务端提供的参数。
{
"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": "vless",
"settings": {
"vnext": [
{
"address": "node.example.net",
"port": 443,
"users": [
{
"id": "e7c3a416-5c9e-4f2b-9d81-73d14a9b8620",
"encryption": "none"
}
]
}
]
},
"streamSettings": {
"network": "tcp",
"security": "tls",
"tlsSettings": {
"serverName": "node.example.net",
"allowInsecure": false
}
}
}
]
}
本例没有单独编写 routing,默认通过首个出站处理请求,也没有提供分流规则集或系统代理设置。启动一个 SOCKS 监听端口,并不意味着系统中的全部应用都会自动使用它。若 10808 已被桌面客户端占用,应先停止重复实例或修改端口。
转换方案:区分节点迁移与整套配置迁移
节点迁移:分享链接或列表订阅
- 保留地址、端口、UUID、传输与安全参数。
- 由客户端生成本地入站和运行配置。
- DNS 与 routing 在目标客户端单独核对。
完整部署:原生 JSON
- 检查 inbounds 的监听地址和端口占用。
- 核对出站标签、路由引用与外部文件依赖。
- 使用对应内核验证配置,再启动测试。
从完整 JSON 导出一个分享链接时,DNS、路由、多出站选择与本地监听设置通常不能随链接一并保留。
“原生 JSON”也不意味着跨内核通用。Xray 与 V2Fly 共享部分配置结构,但协议能力和字段演进并不完全一致。例如含 REALITY 的 Xray 配置不能仅通过更换文件名交给 V2Fly 使用。转换器应明确输入格式、输出内核和参数覆盖范围。
六、v2rayN 导入:订阅地址与剪贴板链接分开操作
以下以 v2rayN 7.x 中文界面的常见菜单为参考,不同小版本的标点和入口位置可能调整。先判断手里的内容是 HTTPS 订阅地址、单条分享链接,还是完整配置文件,再选择入口。把网页地址贴到节点导入窗口,常会得到“没有有效内容”一类结果。
- 添加订阅地址:打开「订阅分组」→「订阅分组设置」,新建分组,填写备注及提供方给出的订阅 URL,保存后选中该分组。
- 获取节点列表:在「订阅分组」菜单中选择更新当前订阅的操作。能够直连时先走不通过代理的更新;直连超时而现有代理可用时,再选择通过代理更新。
- 导入单条链接:复制完整的
vmess://或vless://,使用「服务器」→「从剪贴板导入批量URL」。多条链接按行排列,保持每条链接完整。 - 导入完整配置:查找服务器菜单中的自定义配置导入入口,选择本地 JSON 文件并匹配所需内核。不要预期它会自动拆成可逐项编辑的普通节点。
- 检查实际运行:设为活动节点并重新加载,查看日志是否有配置解析、端口占用或 TLS 握手错误,再发起真实网页请求。
手工导入的节点通常只是当前快照。提供方之后更换地址或 UUID,不会自动修改已经复制出来的链接;订阅更新则可能覆盖该分组内的节点。需要长期保留的手动修改,宜放在独立分组,避免与订阅维护的条目混在一起。
七、订阅解析与互转常见问题
Base64 能解码,为什么 v2rayN 还是导入失败?
先看解码结果是否真的是逐行分享链接。若是 HTML、错误提示或原生配置对象,应换对应入口;若是链接列表,先只导入其中一条,检查前缀、换行和 UUID,缩小问题范围。
拿到 JSON 文件,可以直接重新编码成订阅吗?
不能仅靠编码完成格式转换。若文件是完整内核配置,需要先选定一个出站,按分享格式提取协议、服务器、用户和传输参数,再生成链接。只把整个文件做 Base64 编码,通常不会得到客户端期望的节点列表。
订阅更新超时,是不是订阅格式错了?
超时首先属于获取阶段的问题。检查订阅地址是否完整、域名能否解析、当前网络能否访问;已有可用节点时再尝试通过代理更新。只有拿到响应后出现解析错误,才继续检查 Base64 和节点格式。
导入成功但打不开网页,应该改哪个参数?
先确认活动节点和系统代理状态,再查看日志。连接被拒绝优先核对地址与 443 等服务端口;TLS 错误核对 SNI、证书与系统时间;认证失败核对 UUID。不要用开启跳过证书验证替代正确的 TLS 设置。
中文备注乱码,会影响节点连接吗?
备注通常不影响连接,但乱码提示转换流程可能没有正确处理 UTF-8。VMess JSON 用 UTF-8 后再做 Base64;VLESS 的备注和查询参数按 URI 规则编码。不要把整条链接反复整体编码,否则冒号、问号与分隔符也会失去结构作用。
完成互转后的验收顺序应是:内容能解析、字段能对应、内核能启动、请求能通过。保存原始订阅或配置作为参照,只在副本上修改。更多字段结构可查阅配置大全,协议名称与传输术语可对照术语表。