一、先记录错误,区分失败发生在哪一步

订阅更新不是单一步骤。客户端先请求订阅地址,再解析返回内容,接着检查配置与内核是否兼容,最后加载节点、代理组及外部资源。界面上的“更新失败”可能对应其中任意一环。先定位阶段,比反复重装客户端更有效。

  1. 进入客户端的「订阅」或「配置」页,找到出错的配置卡片,记录当前更新时间与配置名称。
  2. 打开「日志」,清楚旧记录或记住当前时间,再回到配置卡片,只点击一次「更新」。不同客户端的按钮名称可能是「刷新」或「更新订阅」。
  3. 返回日志,找出这次操作之后最早出现的错误。保留错误类型、HTTP 状态码、行号和字段名,不要只截取最后一行“失败”。
日志或界面提示通常所在阶段优先检查
no such host域名解析订阅域名、当前网络 DNS
timeout、deadline exceeded连接或响应等待拉取路径、网络、服务端响应
HTTP 401、403、404、429服务端返回拒绝或错误链接权限、有效期、请求频率
yaml: line 12内容解析实际响应正文、第 12 行附近缩进
unsupported proxy type配置兼容性检查协议类型与实际运行的内核
更新完成但节点为空配置加载或节点提供者更新激活配置、过滤条件、providers 日志

二、链接自查:确认复制的是订阅地址

1. 从服务面板重新复制 Clash 格式链接

进入订阅提供方的账户面板,找到「订阅」→「复制订阅地址」,选择明确标注 Clash 或 Mihomo 的输出格式。账户首页地址、套餐购买页面、二维码图片地址,都不能直接当成配置 URL。二维码内也可能是唤起客户端的导入指令,应优先使用面板提供的原始 HTTPS 订阅地址。

  • 检查开头是否为完整的 https://,末尾是否混入空格、换行或聊天软件附加的标点。
  • 保留 ? 后面的查询参数;令牌通常位于参数或路径中,删除后可能返回 401 或 403。
  • 若链接曾经重置,旧地址可能立即失效。编辑已有配置的订阅 URL 后再更新,避免误点同名旧配置。
  • 检查账户到期时间和流量状态。提供方可能通过状态码或说明文本表达停用原因,具体以账户面板为准。

2. 状态码要与返回内容一起看

401 通常表示需要有效身份信息;403 可能是访问策略、令牌权限或防护拦截;404 可能是路径已变更,也可能是服务端隐藏无效资源的方式。遇到 429,先停止连续刷新,按服务端提示等待;若响应包含 Retry-After,以该值为准。5xx 通常需要提供方检查服务端,但也应留意中间网关返回的错误页面。

HTTP 200 只表示请求收到了成功响应,不代表正文一定是 Clash 配置。如果正文以 <!DOCTYPE html> 开头,或包含登录、验证码、套餐说明,那么解析器拿到的是网页。此时修 YAML 缩进没有意义,需要先处理链接或服务端返回内容。

三、网络自查:分开测试直连、代理与 DNS

浏览器能打开账户面板,不等于客户端能拉取订阅。面板和订阅可能使用不同域名;浏览器、客户端界面进程以及内核也可能走不同的网络路径。先保持其他设置不变,再做单项对照。

  1. 核对系统时间。在系统「日期与时间」中打开自动校时。明显错误的日期可能导致 TLS 证书有效期检查失败。
  2. 检查拉取模式。在配置卡片菜单或订阅设置中查找「通过代理更新」「更新方式」等选项。若客户端提供该功能,分别测试直连和通过当前可用代理更新,并记录结果。
  3. 换网络复测。在允许使用的网络环境中,将电脑临时接入手机热点,再更新同一份订阅。若只在一个网络失败,优先检查该网络的解析、认证或访问限制。
  4. 检查本地代理端口。打开客户端「设置」中的端口信息,确认 HTTP 或 mixed 端口确实正在监听,不能直接套用网上的默认值。

用本机命令区分响应与连接故障

有命令行经验时,可在本机比较两种请求路径。下面示例先交互读取订阅地址,避免把完整链接直接写进命令历史;代理端口 7890 只是示例,必须改成客户端显示的 HTTP 或 mixed 端口。命令适用于常见 Bash、Zsh 环境,响应会写入当前目录的本地文件。

printf '输入订阅地址:'
IFS= read -r SUB_URL
curl --noproxy '*' --location --connect-timeout 10 --max-time 30 \
  --output subscription-direct.txt --write-out 'HTTP %{http_code}\n' "$SUB_URL"
curl --noproxy '' --proxy http://127.0.0.1:7890 --location \
  --connect-timeout 10 --max-time 30 \
  --output subscription-proxy.txt --write-out 'HTTP %{http_code}\n' "$SUB_URL"
unset SUB_URL

这里设置了 10 秒连接超时与 30 秒整体等待上限,用于形成可比较的诊断条件,不是推荐所有客户端统一使用的参数。文件可能包含节点密码和令牌,检查后应妥善删除,不要同步到公开仓库。命令测试也不能完全复现客户端的 User-Agent、请求头和内核路由;出现差异时,将差异作为线索,而不是直接认定某一端有问题。

如果日志是 no such host,先检查系统能否解析订阅域名。订阅请求尚未进入内核时,修改 YAML 中的 dns: 不一定生效。TUN 会改变部分网络流量的接管方式,但不能修复过期令牌或格式错误;排查期间不要同时切换 TUN、DNS 和规则模式。

四、格式自查:YAML 报错与内核不兼容分开处理

确认收到的是完整配置还是节点列表

Clash 完整配置常见顶层字段包括 proxies、proxy-groups、rules,也可能通过 proxy-providers 引用外部节点,因此不能只凭没有内联节点就判定内容为空。另一方面,一行行的协议分享链接、通用 Base64 订阅以及仅供 provider 使用的节点列表,并不等同于可直接激活的完整配置。

先查看客户端的导入入口要求,再确认订阅提供方输出类型。客户端若没有承诺支持自动转换,就应选择匹配的格式。需要转换时,优先使用提供方明确支持的方式或可信的本地处理流程,避免把访问令牌交给陌生在线服务。

按错误行号检查缩进和数据类型

日志中的行号是检查起点,不保证错误恰好发生在那里。例如第 12 行报错,原因可能是第 11 行少了引号。YAML 缩进应使用空格,避免 Tab;冒号后需要正确分隔,列表项前需要连字符。以下只是展示层级的片段,不能单独作为完整订阅导入:

proxy-groups:
  - name: "手动选择"
    type: select
    proxies:
      - "节点 A"
rules:
  - "MATCH,手动选择"
  • mapping values are not allowed:检查冒号、缩进以及上一行是否漏掉引号。
  • cannot unmarshal:检查字段需要的是字符串、列表还是映射,不要只调整空格。
  • 提示代理组引用不存在:对照节点名与组名,包括大小写、空格和符号是否完全一致。
  • 仅修改远程订阅下载后的缓存文件:下一次更新可能覆盖修改,应回到源配置或客户端支持的覆写层处理。

核对实际运行的内核

进入「设置」→「关于」或客户端的内核信息页,记录客户端版本与内核版本,两者不是同一个版本号。Clash Meta 现通常称为 mihomo;不同分支、不同版本支持的协议和字段并不完全一致。出现 unsupported proxy type 时,应按报错中的具体协议检查兼容性,而不是删除该字段强行加载。

更换客户端或内核前先备份配置,再从可信发布渠道获取适配版本。若当前设备不能使用所需内核,可询问提供方是否有兼容输出。单纯升级界面程序不一定切换了正在运行的内核,更新后还需回到内核信息页确认。

五、更新成功但节点列表为空:检查激活状态与 providers

“订阅更新完成”可能只表示主配置已下载,不代表主配置引用的所有资源都已成功获取。尤其在使用 proxy-providers 时,节点文件是另一次请求,可能有独立的地址、缓存与更新周期。

  1. 确认当前激活项。回到「配置」或「订阅」页,检查当前选中标记是否位于刚更新的配置。更新配置 A 不等于已经从配置 B 切换到 A。
  2. 查看全部代理组。打开「代理」页,展开实际引用节点的组。有些首页只显示当前策略,并不展示全部节点。
  3. 检查 provider 状态。若客户端提供「代理提供者」页面,查看节点数量、更新时间与错误。没有独立页面时,到日志中查找 provider 名称与下载错误。
  4. 检查过滤表达式。正则过滤可能将所有节点排除。先在备份副本或本地覆写中移除相关过滤条件测试,不要直接破坏唯一可用配置。
  5. 检查代理组引用。provider 名称必须与代理组 use 中的名称一致。provider 已有节点但代理组没有引用,界面仍可能看不到预期节点。

若日志指出的是规则提供者 rule-providers 更新失败,应单独检查规则文件地址及格式。规则资源错误不等于节点订阅为空,但可能影响配置加载或分流行为,需要以具体日志为准。

六、恢复验证与求助信息清单

修复后按“更新、加载、连接”三个阶段验证。先手动更新一次,确认日志没有新的订阅请求错误;再激活目标配置,确认节点或 provider 数量符合预期;最后选择一个节点,使用日常需要访问的服务进行连接验证,并在连接页面检查实际出口与规则匹配结果。

  • 更新验证:记录操作时间,确认配置更新时间发生变化;使用 provider 时,同时检查其更新时间。
  • 加载验证:确认没有 YAML、协议类型或代理组引用错误,且实际激活的是目标配置。
  • 连接验证:检查系统代理或按需启用的 TUN 是否处于预期状态,避免把未接管流量误判为订阅故障。
  • 持久化验证:恢复合理的自动更新计划,观察下一次更新是否仍能保留所需的本地覆写。

仍然失败时,提供这些信息

向订阅提供方或客户端维护者反馈时,附上操作系统、客户端版本、内核名称与版本、失败时间和时区、脱敏后的完整错误,以及直连和代理更新的对照结果。说明返回的是 HTTP 错误、网页内容还是 YAML 解析错误,可以明显减少来回询问。

需要提交配置片段时,只保留复现所必需的字段,并替换服务器地址、密码和访问令牌。若完整订阅已经泄露,应在账户面板重置订阅链接,再更新客户端保存的地址。后续可参考完整手册的订阅章节整理配置,避免把远程订阅、节点提供者和本地覆写混在同一层处理。