FAILURE LAYERS

先区分下载失败、转换失败与配置加载失败

“订阅失败”不是一个单一故障。客户端从订阅地址取得配置并使其生效,至少经过网络请求、服务器响应、内容识别、YAML 解析、字段校验和内核加载几个阶段。不同阶段给出的提示可能相近,但处理方法完全不同。直接反复点击更新,通常只会重复同一错误。

第一类是下载失败。客户端没有取得可用响应,常见表现包括请求超时、连接被重置、域名解析失败、HTTP 401、403、404、429 或 5xx。此时还没有进入 YAML 解析,修改本地配置缩进不会产生作用。

第二类是响应内容不符合预期。请求本身返回成功状态,但正文可能是登录页面、访问验证页面、套餐到期说明、JSON 错误对象,或者只包含节点 URI 的文本。浏览器能打开地址,只能证明浏览器得到了一份响应,不能证明该响应就是当前客户端可加载的 Clash 配置。

第三类是语法或字段解析失败。服务器确实返回 YAML,但缩进、冒号、引号、列表层级或字符编码存在问题;也可能配置采用了当前内核不认识的字段。此时日志一般会出现类似 YAML、unmarshal、decode、field、proxy 或 rule 的关键词。

第四类是加载后不可用。订阅已经进入配置列表,也能看到节点名称,但启用配置时失败,或者启用后无法连接。这通常与缺失的策略组、规则引用错误、代理协议参数不完整、DNS 配置冲突或内核版本差异有关,不应继续按“链接打不开”的方向处理。

URL STATUS

检查订阅链接状态与请求条件

订阅地址通常包含用于识别账户或授权范围的查询参数。复制过程中漏掉问号后的参数、把连接符截断、混入换行,都会使服务器返回错误结果。检查时应从服务提供方的订阅管理页面重新复制完整地址,不要手工拼接,也不要在聊天记录里选中一部分后继续使用。

确认地址没有被截断或转义

  • 检查地址是否以 http://https:// 开头,域名和路径是否完整。
  • 确认查询参数仍然存在,尤其是问号、等号、连接符以及参数值末尾字符。
  • 从二维码识别或跨设备复制时,检查地址中间是否插入空格、中文标点或换行。
  • 如果地址被包在 YAML 字符串中,含有特殊字符时应使用引号包围,避免被当作注释或语法标记。

根据 HTTP 状态判断方向

401 / 403
授权参数失效、请求条件不满足或服务器拒绝访问。应重新获取订阅地址,并检查账户状态与服务端限制。
404 / 410
路径不存在或资源已经撤销。旧地址可能被服务端更换,继续刷新本地缓存不会恢复。
429
短时间更新次数过多。停止连续刷新,等待限制窗口结束后再进行一次测试。
5xx
服务端暂时无法完成请求。应保留错误时间与状态码,稍后重试或联系订阅提供方。

如果错误是超时或域名解析失败,还要检查当前基础网络。测试时先暂时停用系统代理和 TUN,再访问订阅域名,可以判断订阅更新是否错误地依赖了尚未启动的代理。某些客户端允许为配置更新指定 DIRECT 或代理策略;当订阅域名在当前网络无法直连时,需要明确更新流量走向,避免形成“必须加载配置才能访问订阅,但必须访问订阅才能加载配置”的循环。

RESPONSE BODY

判断响应正文是否真的是 Clash 配置

HTTP 200 只表示服务器完成了一次请求,不代表正文格式正确。最典型的情况是订阅地址跳转到了登录页或访问验证页,客户端收到的是 HTML。解析器随后可能在第一行的 <!doctype html><html> 或其他标签附近报错。

完整的 Clash 配置通常是 YAML 文本,常见顶层字段包括 proxiesproxy-groupsrulesdnsproxy-providersrule-providers。字段组合会因配置用途而变化,不要求每份文件都包含全部字段,但正文不应是一段网页、错误提示或账户信息页面。

proxies:
  - name: "Example Node"
    type: ss
    server: example.invalid
    port: 443
    cipher: aes-128-gcm
    password: "example-password"

proxy-groups:
  - name: "节点选择"
    type: select
    proxies:
      - "Example Node"
      - DIRECT

rules:
  - MATCH,节点选择

另一种常见响应是经过 Base64 编码的节点 URI 集合,解码后可能由 ss://trojan://vmess:// 等条目组成。这类内容不是完整 Clash YAML。部分图形客户端会在导入时调用转换流程,另一些客户端只接受完整配置,因此同一链接在不同软件中可能得到不同结果。应在服务端订阅页面选择明确标注为 Clash、Mihomo 或兼容格式的输出,而不是把任意通用订阅直接当作 YAML 文件加载。

还要留意重定向。订阅地址可能先返回 301 或 302,再跳转到实际下载地址。若客户端禁止跨域重定向、目标域名证书异常,或跳转后丢失授权参数,浏览器和客户端的结果可能不同。日志中若同时出现 redirect、certificate、TLS 或 hostname,应优先检查跳转目标与系统时间,而不是修改代理节点字段。

响应字符编码一般应为 UTF-8。文件开头出现异常不可见字符、正文被错误地按其他编码读取,可能导致第一行字段无法识别。可以使用可信的本地文本编辑器查看编码并另存为 UTF-8,再以本地配置方式测试。若本地文件可加载而远程订阅不可加载,问题通常位于服务端响应头、正文编码或下载链路。

YAML PARSING

逐项检查 YAML 缩进、引号与列表结构

YAML 依靠缩进表达层级,空格数量和字段位置会直接改变数据结构。Clash 配置通常使用两个空格作为一级缩进。YAML 规范允许其他一致的空格宽度,但实际排查时统一为两个空格最容易阅读,也能降低复制片段时的层级错误。制表符不应用于缩进。

最常见的语法错误

  1. 列表符号层级错误:- name 必须位于对应列表字段之下。若与 proxies: 顶格,解析器会把它视为新的根级结构并报错。
  2. 冒号后缺少空格:字段通常写成 port: 443,而不是 port:443。后者可能被识别成普通字符串。
  3. 名称含特殊字符却没有引号:节点名或策略组名含冒号、井号、方括号、花括号、前导星号时,建议使用双引号包围。
  4. 注释截断值:未加引号的井号会开始注释。密码或名称里包含井号时,井号后的内容可能被忽略。
  5. 重复键或错误类型:同一层级重复声明 rules,或者把需要列表的字段写成单个字符串,可能在解析或字段校验阶段失败。

以下片段的问题是 proxies 中的条目少了一层缩进,并且策略组引用的名称与实际节点名称不一致:

proxies:
- name: "香港节点"
  type: ss

proxy-groups:
  - name: "节点选择"
    type: select
    proxies:
      - "香港节点 01"

修正缩进只是第一步。策略组中的节点名称、规则中的策略名称、provider 引用名称都必须与定义处逐字一致,包括空格、大小写和全角字符。YAML 能成功解析,不代表这些引用一定有效;引用错误通常在内核加载配置时才会出现。

如果日志给出了行号和列号,应先查看报错行,再向上检查最近的父级字段。解析器指出的位置有时是“无法继续解析”的位置,真正错误可能在前一行,例如引号未闭合、数组括号缺失,或上一层缩进提前结束。不要只删除报错行,否则可能把配置变成语法正确但功能残缺的文件。

CORE COMPATIBILITY

核对 Clash 与 Mihomo 的字段兼容性

配置语法正确后,仍可能因为内核能力不同而加载失败。传统 Clash、Clash Meta 的后续实现 Mihomo,以及不同图形客户端内置的内核版本,并不保证支持完全相同的协议参数和扩展字段。订阅提供方若按较新的 Mihomo 格式生成配置,而客户端仍使用较旧内核,就可能出现字段未知、代理类型不支持或参数无法反序列化。

排查时先在客户端的“关于”“内核”或日志开头查看实际运行的内核名称与版本,不要只依据图形客户端名称判断。某些客户端可以切换内核,配置更新后却仍由旧内核执行;也有客户端本体已更新,但内核文件没有同步更新。

容易产生版本差异的区域

  • 代理协议字段:新协议类型、传输层参数、指纹参数和 UDP 相关选项可能需要较新的 Mihomo 版本。
  • TUN 配置:不同版本对网络栈、自动路由、接口探测和 DNS 劫持字段的取值要求可能不同。字段存在不等于当前平台具备对应权限。
  • DNS 增强模式:fake-ipredir-host、nameserver policy 与 fallback 相关结构需要保持层级和类型正确,旧配置范例未必适用于当前内核。
  • 规则集与 provider:rule-providersproxy-providers 的远程地址、更新间隔、文件路径和 behavior 必须符合内核支持的格式。
  • 嗅探与地理数据:sniffer、GEOSITE、GEOIP 和 geodata 相关行为会随内核实现及数据文件状态变化。

日志出现 field not foundunsupported proxy typeinvalid value 或类似信息时,应围绕对应字段查阅当前内核文档。临时删除未知字段可以用于确认故障来源,但不应在不了解功能影响时长期使用。例如删除 TUN 的路由字段可能让配置成功加载,却使系统流量没有进入内核;删除 DNS 部分也可能改变域名解析路径。

若订阅服务同时提供 Clash 与 Mihomo 格式,使用 Mihomo 内核的客户端通常应选择明确对应 Mihomo 的配置。反过来,旧版 Clash 内核应使用其能够识别的基础字段。不要通过反复改文件扩展名来解决兼容问题,扩展名不会转换配置结构。

CACHE AND UPDATE

清理失败缓存并确认配置确实完成更新

不少图形客户端会把远程订阅下载到本地文件,再从本地缓存加载。更新失败时,客户端可能继续使用上一次成功的版本;也可能写入一份只有错误页面内容的临时文件。因而“节点列表仍然存在”不能证明刚才更新成功,“更新时间已变化”也不能单独证明新配置已经被内核接受。

先记录当前可用配置的名称与更新时间,并导出必要的本地覆写内容。随后在客户端日志中确认更新动作包含“请求完成、文件写入、配置校验、内核重载”这些阶段。若只看到下载完成,没有看到 reload 或配置切换成功,说明流程可能停在校验阶段。

安全的缓存处理顺序

  1. 停止自动更新,避免排查期间持续覆盖文件或触发频率限制。
  2. 保留最近一次能够工作的本地配置副本,以便恢复基础网络。
  3. 删除客户端中对应的失败订阅记录,再使用重新复制的完整地址添加。
  4. 完全退出客户端并重新启动,确认后台内核进程也已结束。
  5. 执行一次手动更新,立即查看日志中的 HTTP 状态、文件路径和首个错误。
  6. 更新成功后再启用自动更新,并设置合理间隔。

如果客户端支持覆写、合并或预处理,还要暂时停用这些功能。原始订阅可以解析,但合并后失败,说明故障位于本地覆写文件。常见问题包括覆写后产生重复策略组、规则指向已删除的组、把列表替换成对象,以及向旧内核写入新字段。

配置存放路径也可能造成误判。系统权限不足、路径含不可处理字符、磁盘空间不足或安全软件阻止写入时,客户端下载成功却无法替换旧文件。此类日志通常包含 write、permission、rename、file in use 等信息。应修复文件写入条件,而不是继续修改远程订阅。

DIAGNOSTIC ORDER

按固定顺序完成订阅导入自查

高效排查的关键是一次只验证一层,并保留每一步结果。下面的顺序适用于“订阅链接失效”“配置解析失败”“更新后无法启用”等相邻问题,也能减少网络故障、格式故障和客户端故障互相干扰。

  1. 验证基础网络:暂停系统代理或 TUN,确认普通网络和 DNS 可用,再测试订阅域名是否能够建立连接。
  2. 重新取得地址:从订阅管理页面复制完整链接,排除截断、过期和手工修改。
  3. 记录请求结果:查看 HTTP 状态、重定向、TLS 提示和响应类型,不以浏览器“能打开”作为唯一判断。
  4. 识别正文格式:确认返回内容是完整 Clash YAML、provider 文件还是 URI 集合,并选择匹配的导入方式。
  5. 检查 YAML:按报错行检查缩进、引号、冒号、列表和引用名称,先建立可加载的最小配置。
  6. 核对内核版本:确认客户端实际使用 Clash 还是 Mihomo,并检查报错字段是否受当前版本支持。
  7. 停用本地覆写:以原始订阅测试,随后逐项恢复规则合并、脚本、DNS 和 TUN 修改。
  8. 处理缓存:保留可用副本后重新添加订阅,确认下载、校验、写入和内核重载全部完成。
  9. 验证运行结果:查看策略组是否完整、规则是否命中、DNS 是否返回预期结果,再测试实际连接。

向订阅提供方反馈时,建议给出发生时间、客户端名称、实际内核与版本、HTTP 状态、错误日志前后数行,以及已经遮蔽授权信息的响应开头。不要只发送“导入不了”的截图。明确证据可以快速判断问题位于订阅生成、服务器访问控制、格式转换还是客户端兼容层。

如果同一份本地 YAML 在当前内核能够加载,而远程地址导入失败,应重点检查下载请求、重定向、响应编码和缓存写入。如果多个客户端都能下载正文,但都在同一字段报错,则更可能是服务端生成的配置存在语法或兼容问题。如果只有一台设备失败,则应回到该设备的系统时间、网络、证书、文件权限和客户端内核版本继续检查。

完成修复后,保留一份最近可用配置,并记录订阅格式与适用内核。后续出现更新异常时,可以迅速区分“远程订阅发生变化”与“本地运行环境发生变化”,避免在无法联网时失去全部排查条件。