故障排查 预计阅读 10 分钟

Clash 订阅更新失败与配置解析报错:原因清单与自查顺序

订阅链接过期、返回格式不对、YAML 缩进错误、内核不支持新字段,按从外到内的顺序逐步定位,并说明日志里各类报错的含义。

先定位阶段:请求、解析还是配置加载

“订阅更新失败”是客户端给出的汇总结果,不等于订阅地址失效。一次更新通常包含请求订阅地址、接收响应、解析配置、应用覆写、交给内核加载几个步骤。完整配置还可能引用远程节点集合与规则集合,它们各有独立的下载过程。

排查时先保留当前能运行的配置。不要删除全部订阅,也不要连续切换系统代理、TUN 模式和 DNS。一次只改一个条件,记录更新时间与对应日志,才能判断失败发生在哪一步。

  1. 备份:在「订阅」或「配置」页面导出当前配置;另行保存本地覆写、脚本和规则。导出文件可能包含节点凭据,应存放在受限目录。
  2. 复现:打开「日志」,临时选择 info 级别,手动更新一次,记录同一时间附近的错误。细节不足时再临时使用 debug。
  3. 分类:先看是否存在 HTTP 状态码或网络错误,再看 YAML 行号,最后看代理组、规则与字段相关错误。
  4. 留档:记录客户端版本、实际内核名称和内核版本。客户端版本不等于 mihomo 版本;命令行可用 mihomo -v 查询该可执行文件的版本。

订阅请求失败:先查链接与 HTTP 响应

状态码与下一步操作

从服务提供方账户页面重新复制完整订阅地址,不要手动拼接参数。地址中的令牌、查询参数和路径都可能影响结果。聊天软件换行、复制时带入空格、把 & 误写成 &,都可能让地址指向不同资源。

响应或日志常见含义检查顺序
401 / 403身份验证失败、令牌失效或访问策略拒绝检查账户状态、重新获取链接,再核对设备与客户端限制;403 也可能来自网关或防护页面
404 / 410路径不存在或资源已撤下回到账户页面取新地址,不要只修改原地址中的域名
429请求频率受到限制停止重复点击,参考 Retry-After 或服务端说明等待重试
500 / 502 / 503服务端或上游异常保留旧配置,稍后重试,并检查服务提供方公告
200 但解析失败收到响应,但内容未必是配置检查正文是否为登录页、验证页、错误 JSON 或其他订阅格式

浏览器能打开,不代表客户端能更新

浏览器可能携带登录 Cookie、完成网页验证,或者通过扩展使用另一条代理路径;客户端的订阅请求通常没有这些条件。因此,看到网页成功并不能证明订阅接口可供客户端访问。遇到 301 或 302 时,应确认跳转目标仍是订阅资源,而不是登录页面。

需要核对原始响应时,可在 macOS、Linux 的 Bash 终端使用下面的命令。它不会把地址直接写入命令历史,也不会自动跟随重定向;先查看响应头,再决定是否继续访问跳转地址。该命令仅用于诊断直连路径,不代表所有客户端都按直连方式更新。

read -r -s -p '订阅地址:' SUB_URL
printf '\n'
curl --noproxy '*' \
  --connect-timeout 10 \
  --max-time 30 \
  --dump-header response.headers \
  --output response.body \
  --write-out 'HTTP %{http_code}\n' \
  "$SUB_URL"
unset SUB_URL

response.headers 与 response.body 都可能包含敏感信息。只在本机检查,诊断后删除。不要把订阅地址粘贴到公开转换站,也不要把完整响应交给公共在线 YAML 检查工具。

网络与 TLS 错误:分开测试直连和代理路径

如果没有拿到 HTTP 响应,应先解决网络连接。系统代理只影响遵循系统代理设置的请求;客户端自身的订阅下载可能使用内部下载器。TUN 模式会改变部分流量的路由,但不能修复过期令牌、错误格式或 YAML 语法。

  • no such host:域名解析失败。核对订阅域名拼写,再检查系统 DNS 与客户端 DNS 日志;不要把解析失败误判成节点协议错误。
  • connection refused:目标地址主动拒绝连接。如果日志指向 127.0.0.1:7890,先确认本地代理正在监听该端口,而不是立即更换订阅。
  • i/o timeout、context deadline exceeded:连接、TLS 或读取响应超时。分别尝试客户端提供的直连更新与代理更新,每条路径只测试一次并记录结果。
  • x509、证书过期或主机名不匹配:检查系统日期、时间同步、订阅域名和网络中的 HTTPS 检查软件。不要通过关闭证书验证来掩盖问题。

如果更新依赖代理,而当前订阅恰好已经无法加载,就可能形成启动依赖:没有可用节点,便无法下载替代配置。此时可切回之前保存的可用配置,再执行代理更新;或在服务允许的情况下使用可访问的直连入口。保留旧配置比反复清空客户端数据更有利于恢复。

返回格式不对:区分完整配置与节点集合

HTTP 200 只表示请求成功,不能证明返回内容能被当前导入入口使用。用本地文本编辑器查看响应开头与顶层字段,并对照服务提供方给出的格式名称,不要只看文件扩展名。

响应特征可能的内容处理方式
<!DOCTYPE html> 或 <html登录页、验证页或网页错误提示获取真正的订阅接口地址;不要将网页另存为 YAML 后导入
一长串编码文本,或逐行协议链接其他客户端使用的节点订阅在账户页面选择 Clash 或服务标注的 mihomo 兼容输出
只有 proxies: 节点列表可能是节点集合文件确认是否应由 proxy-providers 引用,而非作为完整配置直接启用
包含 proxy-groups:、rules: 等字段可能是完整配置继续检查语法、引用关系和内核兼容性,不能仅凭字段存在就认定可运行

如果主配置能加载,但日志中的失败 URL 属于 proxy-providers 或 rule-providers,问题在被引用的资源,不一定在主订阅。节点集合与规则集合的内容结构也不同。应核对相应 provider 的 url、format、behavior 与实际响应,避免把规则列表当作节点列表解析。

YAML 解析报错:按行号检查缩进与类型

yaml: line …、did not find expected key、cannot unmarshal 一般指向文本结构或数据类型问题。日志给出的行号通常是解析器发现异常的位置,真正错误也可能在上一行,例如引号未闭合、列表层级不对或冒号后缺少空格。

优先检查的四项

  1. 缩进:统一使用空格,不用 Tab。每层 2 个空格是常用约定,并非 YAML 唯一允许的宽度;同层字段必须对齐。
  2. 标点:字段使用半角冒号,键值之间留空格。不要把中文冒号、弯引号复制进配置语法。
  3. 类型:端口通常填整数,例如 7890;布尔值写 true 或 false;列表项以 - 开头。把整个列表写成字符串可能触发类型错误。
  4. 名称与特殊字符:名称含 : 、 # 等片段时应正确加引号。策略组引用名称时,空格、大小写与符号都要一致。

下面是用于隔离问题的直连配置,不包含订阅节点。它只用来确认基础 YAML 能被本地内核读取,不用于测试代理连通性。若端口 7890 已占用,应先停止占用程序,或在测试副本中选择空闲端口。

mixed-port: 7890
allow-lan: false
mode: rule
log-level: info

rules:
  - MATCH,DIRECT

将配置保存为 UTF-8 文本 profile.yaml。对 mihomo 可使用下面的命令进行配置测试。Windows PowerShell 中,若可执行文件位于当前目录,可使用 .\mihomo.exe -t -f .\profile.yaml。

mihomo -v
mihomo -t -f ./profile.yaml

测试应尽量使用客户端实际运行的同一内核与工作目录。包含远程 provider 或相对路径时,测试还可能受网络、缓存和文件路径影响。测试通过只说明本次配置检查未发现阻断问题,不等于所有节点、DNS 与规则下载都已验证成功。

语法通过仍不能加载:检查内核、覆写与引用

客户端名称不能替代内核兼容性检查

传统 Clash 与 Clash Meta(现称 mihomo)的能力范围不同,不同版本对协议、传输参数和规则字段的支持也会变化。看到 unsupported proxy type 时,应先核对具体节点类型与实际运行的内核;把文件名改为 .yaml 不会增加协议支持。

未知字段的处理取决于内核版本和配置位置,有些字段会被忽略,有些会报错。因此,“成功导入”也不能证明新字段已经生效。优先使用服务提供方标注的兼容输出,再依据内核发行说明决定是否更新,不要盲目删掉无法识别的字段。

按报错对象核对依赖

  • proxy … not found:检查策略组或规则引用的目标名称。订阅更新后节点改名、本地覆写仍引用旧名称,都可能造成引用失效。
  • 找不到 provider:检查 use: 引用是否与 proxy-providers 中的键名一致,并确认合并过程没有覆盖掉整个 provider 定义。
  • 规则目标不存在:核对规则最后的策略名与代理组名称。例如规则引用某个组时,必须存在同名组,不能仅存在相近名称。
  • address already in use:通常属于运行时端口占用,而非订阅格式错误。检查混合端口、DNS 监听端口或控制接口端口是否与其他进程冲突。

如果下载下来的原始配置能通过测试,而客户端启用后报错,重点检查「覆写」「合并」或「脚本」功能。先导出它们,再临时停用,在未加工的配置上测试一次;之后逐项恢复。尤其留意脚本重命名节点、覆盖 proxy-groups、追加不存在的规则目标等操作。

恢复更新后的验证与反馈清单

错误提示消失后,再做一次完整验证。只看“更新成功”可能漏掉 provider 下载失败或代理组为空;只看网页能打开,也可能只是流量通过了直连规则。

  1. 确认订阅更新时间已变化,并检查节点数量、策略组与规则是否符合预期。
  2. 启用目标配置,查看同一时间段的日志,确认没有新的配置加载错误与 provider 更新错误。
  3. 在「连接」页面发起一次目标访问,检查匹配规则、出站策略与节点名称,确认实际路径。
  4. 恢复临时停用的覆写或脚本,每恢复一项就重新验证;最后将日志级别恢复到日常设置。

需要向客户端维护者或订阅服务提供方反馈时,提供客户端版本、内核版本、操作系统、更新时间、HTTP 状态码,以及脱敏后的完整错误行。配置片段应保留相关缩进与引用关系,但移除订阅令牌、密码、私钥和节点服务器地址。若问题只在某次版本升级后出现,还应注明升级前后的版本。

排查顺序可以归纳为:先确认请求是否到达,再确认响应是不是目标格式,接着检查 YAML 和内核兼容性,最后检查覆写与运行环境。每一层只处理本层证据,通常比同时改端口、DNS 和 TUN 更容易定位原因。需要重新整理安装与配置流程时,可查看客户端教程;需要核对概念时,可查看常见问题。

下载Clash