Clash 订阅格式详解:YAML、Base64 与订阅转换的正确姿势
拆解 Clash YAML、通用 Base64 与各客户端私有格式的区别,说明订阅转换服务的工作原理、常见转换失败原因,以及如何在不同内核客户端之间迁移同一份订阅。
订阅链接到底是什么
订阅链接是一个可以被客户端定时抓取的 HTTP/HTTPS 地址,请求返回的内容里包含一批节点信息,有时还附带分流规则。客户端拿到这份内容后,按照约定的格式解析出节点列表,写入本地配置,供代理引擎调用。理解订阅这件事的关键在于分清两层内容:一层是"节点怎么描述",另一层是"整份配置怎么组织"。前者决定了单条链接的写法,后者决定了整个订阅文件的结构。很多人排查订阅问题时只盯着链接本身,却忽略了客户端到底期望收到哪种结构,这是格式类故障里最常见的认知偏差。
Clash 系客户端(包括基于 Mihomo 内核的分支)天生认识的是 YAML 结构化配置,而机场或搭建者最初生成的往往是通用的节点分享链接,两者需要一层转换才能对接。这个转换环节做得好坏,直接决定了订阅更新是否顺畅、规则是否完整、节点是否齐全。
三种主流格式拆解
Clash YAML 原生配置
这是 Clash 客户端最直接认识的格式,一份完整文件通常包含 proxies(节点列表)、proxy-groups(策略组)、rules(分流规则)、以及可选的 dns、tun 等字段。每个节点以字典形式书写,字段名称是固定的,比如:
proxies:
- name: "HK-01"
type: ss
server: example.com
port: 443
cipher: aes-256-gcm
password: "your-password"
YAML 对缩进极其敏感,一个空格错位就会导致整份配置解析失败,客户端往往只报"配置无效"而不指出具体哪一行,这也是订阅转换环节最容易出错的地方之一。
通用 Base64 节点链接
这是机场普遍使用的分享格式,常见形式是 ss://、vmess://、trojan:// 开头的一行文本,协议头后面跟着一段 Base64 编码的参数集合,解码后能看到服务器地址、端口、加密方式等字段。订阅链接返回的往往是一整批这类文本按行拼接后再整体做一次 Base64 编码,客户端或转换工具需要先做外层解码,再逐行解析每条节点链接。这种格式的优点是跨客户端通用性强,几乎所有主流工具都认识;缺点是不包含策略组和规则信息,只能描述节点本身。
客户端私有格式
部分客户端在 YAML 基础上扩展了自己的字段,比如分组的展示样式、图标地址、特定的 DNS 写法。这些扩展字段对原生 Clash 内核是无害的冗余信息,但如果直接把 A 客户端导出的配置拿去给 B 客户端用,B 客户端可能因为不认识某个私有字段而报错,或者干脆忽略掉导致功能缺失。这也是"同一份订阅换个客户端就出问题"的根源之一。
判断一条订阅链接返回的是哪种格式很简单:用浏览器直接打开链接,如果看到大段无规律的字符且没有明显的 proxies: 字样,基本是 Base64;如果一打开就是结构化的缩进文本,说明是 YAML。
订阅转换服务的工作原理
订阅转换服务本质上是一个格式翻译层,它先请求原始订阅地址,拿到 Base64 或其他格式的节点列表,逐条解码出服务器、端口、协议、加密参数等信息,再按照目标客户端认识的模板重新拼装成一份 YAML 配置,同时可以按预设规则集注入 proxy-groups 和 rules。整个过程可以概括为三步:抓取原始内容、解析节点字段、按模板重新渲染。
使用转换服务时,实际填入客户端的订阅地址并不是机场给的原始链接,而是转换服务生成的一个新地址,格式类似"转换服务域名 + 参数(包含原始订阅地址、目标格式、规则模板)"。客户端每次刷新订阅,都会请求这个转换地址,转换服务再实时去请求机场的原始订阅、做转换、把结果返回给客户端。这意味着转换服务成了链路中的一个中间环节,一旦它出问题,订阅刷新也会跟着失败,这一点在排查故障时经常被忽略。
选择规则模板时要注意版本匹配,一些模板专门为老版本 Clash 编写,包含的字段在新内核里可能已经废弃或改名,导入后策略组显示异常但又不会直接报错,容易让人误以为是订阅本身的问题。
常见转换失败原因排查
订阅转换失败大致可以归为四类原因,按出现频率从高到低排列:
- 原始订阅地址本身不可达。转换服务需要先抓取原始内容才能做转换,如果机场链接已过期、被限流或者需要特定地区网络才能访问,转换环节会直接失败,报错信息往往显示"无法获取订阅"而非格式问题。
- 节点协议不被转换服务支持。较新的协议类型如果转换服务的模板库还没跟进,解析时会直接跳过这些节点,导致转换后节点数量明显少于原始订阅。
- 规则模板与目标内核版本不匹配。模板里引用了新内核才有的字段,老版本客户端加载后要么报错要么忽略该字段,策略组或分流规则表现异常。
- 特殊字符转义问题。节点备注名如果包含冒号、引号等 YAML 特殊字符,转换环节没有正确转义,会破坏生成文件的语法结构,导致后续所有字段解析全部失败。
排查时建议按顺序检查:先直接访问原始订阅地址确认能否正常打开,再对比转换后节点数量与机场后台显示的节点数量是否一致,最后检查生成的 YAML 里是否有明显的缩进错乱或未转义的特殊字符。多数问题在这三步之内就能定位到具体环节。
不要把多个转换服务链式叠加使用(即用 A 转换服务的输出地址再喂给 B 转换服务),每多一层转换就多一次中间请求失败的风险,且排查时很难判断问题出在哪一层。
跨客户端迁移订阅的步骤
更换 Clash 客户端时,直接复用同一条订阅地址通常是可行的,因为主流客户端都兼容标准 YAML 结构,但要留意私有字段和默认策略组命名的差异。建议按以下步骤操作:
- 先在新客户端里单独添加订阅,不要立即删除旧客户端的配置,保留一个可回退的对照组。
- 添加完成后手动触发一次订阅更新,检查节点数量是否与原客户端一致。
- 打开策略组页面,确认分组和规则集是否正常加载,尤其注意自动测速分组是否能正常选出节点。
- 如果发现某些自定义规则丢失,大概率是旧客户端里手动追加过本地规则,这部分内容不会随订阅同步,需要在新客户端里重新补上。
- 确认无误后再关闭旧客户端的系统代理或 TUN 模式,避免两个客户端同时抢占网络出口造成冲突。
如果订阅是通过转换服务生成的,迁移时更推荐直接把原始机场订阅地址重新走一次转换流程生成新地址,而不是把上一个客户端生成的转换结果直接复制过去,这样能确保新客户端拿到的是针对自身版本适配过的规则模板。
| 格式类型 | 可读性 | 是否含规则 | 典型来源 |
|---|---|---|---|
| Clash YAML | 结构化,人可直读 | 可包含策略组与规则 | 转换服务生成、手写配置 |
| 通用 Base64 节点链接 | 需解码后查看 | 不含规则,仅节点 | 机场原始订阅 |
| 客户端私有格式 | 结构化,含扩展字段 | 含规则及界面扩展 | 特定客户端导出文件 |
小结
订阅格式问题看似繁琐,拆开看其实只有三个环节:节点本身怎么编码、整份配置怎么组织、以及中间是否经过转换服务加工。遇到订阅无法导入或迁移后功能异常时,先判断问题出在哪个环节,再对照本文的排查顺序逐条核实,大多数格式类故障都能在几分钟内定位并解决。
下载 Clash 客户端
确认好订阅格式后,可以直接在客户端里添加订阅地址完成配置,新手也可以先查看图文教程了解完整流程。