Mihomo 订阅更新失败怎么办?从链接到配置格式逐步排查
简答:Mihomo 订阅更新失败,最快的定位顺序是:先保留旧配置并复制订阅链接,再用 curl 查看 HTTP 状态码和实际响应内容,最后检查它究竟是完整 YAML、节点列表还是 proxy-provider 文件。HTTP 200 不等于 Mihomo 一定能解析;如果日志出现 no such host、timeout、401、403、x509 或 YAML 错误,应按对应层级处理,不要反复点击更新。
定义:Mihomo 订阅更新失败,是订阅地址请求、响应内容解析、配置加载或本地覆写环节中的任一环节未通过,不能只凭“更新失败”四个字判断具体原因。
先试这一步:备份旧配置并确认故障层级
本文是第三方使用指南,本文核对日期为 2026-11-14。Mihomo 的配置文件使用 YAML;官方语法文档明确说明 YAML 区分大小写、使用空格缩进,不能用 Tab。先备份当前能工作的 Profile 或配置文件,再建立临时 Profile 测试,避免新订阅覆盖唯一可用配置。可先参考 Mihomo Syntax 文档。
- 备份:在客户端中找到当前 Profile 的文件路径,复制整个文件或配置目录到单独的备份目录,例如
mihomo-backup-2026-11-14。如果客户端没有显示路径,不要凭记忆猜目录,以当前客户端的 Profile 管理页面为准。 - 建立临时测试:不要直接删除旧 Profile。新建一个空白测试配置,或复制旧配置后再修改订阅地址。
- 记录日志:复制完整英文报错、发生时间、客户端版本和内核版本。版本号、菜单名称和日志格式可能随客户端变化,无法从当前资料确认的版本差异应以实际界面为准。
- 先判断入口:确认你拿到的是订阅 URL、完整 Mihomo 配置,还是
proxy-providers使用的节点提供者 URL。三者不能随意互换。
判定标准:如果请求阶段失败,日志通常会先出现域名解析、连接、TLS 或 HTTP 状态错误;如果请求成功但载入失败,重点看响应正文、YAML 行号、字段兼容性和覆写配置。
按错误文本定位:链接、网络和证书问题
| 日志或现象 | 优先检查 | 处理方式与验证标准 |
|---|---|---|
no such host | DNS 或订阅域名 | 确认域名拼写和 DNS 解析。Windows 可执行 Resolve-DnsName example.com;macOS/Linux 可执行 nslookup example.com。能返回地址不代表订阅有效,只说明域名解析阶段有响应。 |
timeout、context deadline exceeded | 网络路径、出口或下载代理 | 用浏览器之外的命令行测试,避免浏览器缓存或系统代理造成误判。检查是否把更新请求错误地送入 Mihomo 自己的代理端口,必要时先改为直连测试。 |
connection refused | 目标端口未监听或路径被拒绝 | 确认 URL 中的域名、端口和协议。不要把本机代理端口误填成订阅服务器端口。测试结束后恢复原来的更新代理设置。 |
x509、certificate verify failed | 证书链、系统时间或错误的 HTTPS 地址 | 先检查设备日期、时间和时区,再核对 URL 是否被截断或跳转到其他域名。不要为了绕过错误长期关闭证书校验;如果必须临时验证,应只在测试配置中操作并立即回滚。 |
401、403、404、410 | 令牌、权限、地址状态 | 重新从服务管理页面复制完整订阅 URL,确认没有复制管理页面地址、登录页地址或被聊天软件截断的链接。401/403 更偏向身份或权限问题,404/410 更偏向地址不存在或已被替换;最终状态以服务端实际返回为准。 |
安全检查命令示例:
- Windows PowerShell:
$u='https://example.com/sub?token=REDACTED'; curl.exe -I -L --max-time 20 $u - macOS/Linux:
curl -I -L --max-time 20 'https://example.com/sub?token=REDACTED'
上面的命令只查看响应头,不要把真实订阅 URL、token 或完整响应粘贴到公开论坛。若需要查看正文,先保存到本地并遮盖凭据:curl -L --max-time 30 'https://example.com/sub?token=REDACTED' -o subscription-check.txt。判定重点是状态码、Content-Type、是否发生跳转,以及正文开头究竟是 YAML、JSON 错误、HTML 页面还是编码后的节点列表。
区分四种内容:订阅链接、完整配置、Base64 和 proxy-provider
更新失败的常见根源,是把不同类型的内容放进了错误入口。Mihomo 官方 Proxy Providers 文档说明,proxy-providers 的 HTTP 类型需要 url,还可以设置 path、interval、proxy 和自定义请求头。
| 内容类型 | 常见特征 | 应放在哪里 |
|---|---|---|
| 订阅 URL | 一个 HTTPS 或 HTTP 地址,访问后才返回内容 | 客户端的订阅管理入口,或完整配置中的 proxy-providers.*.url |
| 完整 Mihomo 配置 | 通常包含 proxies、proxy-groups、rules 等顶层字段 | 作为 Profile 或配置文件载入 |
| 节点列表或 Base64 文本 | 正文可能是一长串编码文本,未必直接包含 YAML 顶层字段 | 需要客户端或转换服务明确支持的格式,不能直接假定是完整配置 |
| proxy-provider 文件 | 用于提供节点,常与 proxy-providers 配置关联 | 作为 provider 的远程或本地内容,并由代理组引用 |
如果 curl 返回 HTTP 200,但正文是登录页、HTML 错误页、JSON 错误对象或空内容,Mihomo 仍可能无法解析。检查文件开头时只查看前几行,不要公开完整 token:
- PowerShell:
Get-Content .\subscription-check.txt -TotalCount 8 - macOS/Linux:
sed -n '1,8p' subscription-check.txt
看到 <html、登录提示、错误字段或明显的 JSON 错误时,应回到服务管理页面重新生成订阅地址,而不是继续修改 YAML。
用最小配置排除 YAML、覆写和代理环路
确认 URL 能访问且返回内容类型合理后,再排查本地配置。Mihomo 官方快速配置示例展示了 proxy-providers、唯一的 provider 名称、url、type: http、更新间隔和健康检查等结构,可参考 Mihomo Quick Configuration。不要直接照抄示例中的订阅地址、令牌或节点名称。
临时测试时可以保留一个最小 provider 结构,将真实 URL 只填入本地配置:
proxy-providers:
test-provider:
type: http
url: "https://example.com/sub?token=REDACTED"
path: ./proxy_providers/test-provider.yaml
interval: 3600
- 先停用 Merge、Script、规则集和其他本地覆写,只保留一个 provider。不要删除原文件,先把相关段落复制到备份中。
- 确认 provider 名称唯一,并检查代理组是否引用了一个不存在的名称。官方文档列出的 provider 类型包括
http、file和inline;使用http时必须提供url。 - 检查 YAML:冒号后有空格,缩进只用空格,不要使用 Tab;引号成对出现;端口是数字;列表项前的短横线层级正确。
- 如果更新配置时设置了
proxy,确认它指向已经存在且可连接的代理。若这个代理本身依赖正在更新的 provider,可能形成更新环路;先移除proxy做直连测试,再恢复。 - 重新载入临时配置。预期结果是:配置能被载入,provider 文件出现或更新时间变化,节点数量不再为零。若能载入但节点全超时,说明请求和解析可能已经通过,应转向节点协议、出口网络或 DNS 排查。
常见解析报错包括 yaml: line ...、did not find expected key、cannot unmarshal 和 unexpected token。它们优先指向正文格式、缩进、类型或本地覆写,而不是单纯的网络超时。修复后仍失败时,恢复备份文件,重新逐段添加 Merge、Script、规则集和 DNS 设置,每次只恢复一项。
更新成功但节点仍为空:按结果继续判断
“更新成功”“节点数量为 0”“节点存在但全部超时”是三个不同结果。可以按下面的顺序验证:
- 配置载入失败:日志出现 YAML 行号、字段类型或不支持的协议字段。先撤销本地覆写,再核对当前 Mihomo 内核的官方文档和发布说明。本文没有替读者指定某个“最新版本号”;官方版本与构建文件应以 MetaCubeX/mihomo Releases 当前页面为准。
- 配置载入但节点为 0:检查返回正文是否真的是节点内容,provider 是否被过滤,
filter或exclude-filter是否把全部节点排除了,以及代理组是否引用正确的 provider。 - 节点存在但全部超时:更新请求已经成功,不要继续反复刷新订阅。单独测试一个节点,查看 DNS、协议、端口、TLS 和网络出口;同时确认客户端没有继续使用旧 Profile。
- 浏览器可打开、Mihomo 失败:浏览器可能使用了系统代理、登录 Cookie 或不同 User-Agent。Mihomo provider 支持自定义请求头,但是否需要特定 User-Agent 或 Authorization,应以订阅服务实际要求为准,未核实的信息不要自行添加。
如果客户端支持查看 provider 文件路径,可对比文件修改时间和文件大小;如果路径受安全目录限制,官方文档指出 provider 的 path 默认受 HomeDir 限制,跨目录需要额外安全路径设置。不要随意把 token 写入公开脚本或共享目录。
恢复方案:确认修复后再撤销临时改动
- 保留临时测试配置,先确认节点数量、代理组引用和实际连接都正常。
- 关闭临时配置,恢复原 Profile;如果原 Profile 被覆盖,使用备份目录中的文件替换,并重新载入。
- 每次只恢复一个本地修改:先恢复代理组,再恢复规则集,然后恢复 Merge、Script 和 DNS 覆写。
- 每恢复一项就更新一次 provider。若某一步再次出现 YAML 或节点为空,最近恢复的项目就是优先排查对象。
- 清理前不要删除备份。至少确认旧配置、临时配置和 provider 文件都能区分,并记录最后一次成功更新时间。
如果你无法在日志中看到明确错误,先把问题收窄为“URL 请求失败”“内容格式不对”“配置载入失败”或“节点连接失败”四类,再继续处理;这比连续点击更新更容易复现和回滚。
常见问题
Mihomo 订阅更新显示成功,但为什么没有节点?
先确认 provider 文件是否真的更新,再查看返回内容是否是节点列表或有效配置。随后检查 filter、exclude-filter、代理组引用和本地 Merge、Script。若节点存在但全部超时,问题已经从“订阅下载”转为节点连接排查。
浏览器能打开订阅链接,为什么 Mihomo 仍然更新失败?
浏览器可能携带了 Cookie、系统代理或不同的 User-Agent,也可能实际打开的是登录页而不是订阅正文。用 curl 查看状态码、跳转、Content-Type 和正文前几行,并遮盖 URL 中的 token。
能不能把 Base64 订阅直接改成 Mihomo YAML?
不能默认这样处理。Base64 节点列表、完整 Mihomo 配置和 proxy-provider 文件是不同入口;应先确认服务端输出格式和客户端入口是否匹配。仅凭 HTTP 200 或文件后缀不能判断格式。
更新失败时应该先删掉旧配置吗?
不建议。先复制当前可用 Profile 和 provider 文件,建立临时配置测试。确认新配置能载入、节点数量正常且至少一个节点可连接后,再考虑替换旧配置。
Mihomo 报 unsupported proxy type 怎么办?
这通常说明返回配置中出现当前内核或当前构建不识别的协议字段。先记录完整报错和内核版本,暂时停用本地覆写,并对照 Mihomo 官方配置文档和 Releases 页面核实支持情况;不要只改字段名称后继续使用。