TL;DR:
proxy-providers为空先不要怀疑整份 YAML。按 URL 返回内容、path 写入、provider 名称、group use、health-check 和 filter 六项查,基本能定位。
Clash / Mihomo 的 provider 机制很适合把节点列表和主配置拆开,但它也让错误多了一层。主配置启动正常,不代表 provider 已经加载;provider 文件下载成功,也不代表分组真的用了它。
先看这张表
| 检查项 | 正常表现 | 异常表现 |
|---|---|---|
| URL | 返回 provider YAML | 返回 HTML、空文本、登录页 |
| path | 本地生成缓存文件 | 权限不足、目录不存在 |
| interval | 能按周期更新 | 过短导致频繁失败 |
| health-check | 只影响可用性检测 | URL 错或超时让节点灰掉 |
| filter | 只筛目标节点 | 正则过严导致列表为空 |
| group use | 分组引用 provider | 名称不一致,分组无节点 |
provider 为空最常见的是 URL 拿错。很多订阅地址返回完整配置,而 proxy-providers 期待 provider 片段;两者结构不同,不能互换。
URL 与 path
先把 provider URL 单独打开,正文里应能看到节点列表。若返回 <html>、错误提示或完整 Clash 配置,都要回订阅后台换「provider」或「Clash 节点列表」格式。path 是本地缓存文件,OpenClash、Docker、NAS 上要确认目录存在且进程可写。
如果你还没有确定订阅格式,使用兼容 Clash / Singbox / V2Ray 的订阅时也要区分「完整 Clash YAML」和「proxy-provider 片段」,这两种不是同一个入口。
group use 不能写错
示例结构大致如下:
proxy-providers:
main-provider:
type: http
url: https://example.com/provider.yaml
path: ./providers/main.yaml
interval: 3600
health-check:
enable: true
url: https://www.gstatic.com/generate_204
interval: 600
proxy-groups:
- name: Auto
type: url-test
use:
- main-provider
use 里的 main-provider 必须和上方 key 完全一致。大小写、下划线、短横线不一致,Mihomo 不会猜你的意思。
排查清单
- provider URL 可直接下载,状态码不是 301 循环或 403。
- 文件正文不是完整配置里的
proxy-groups、rules大包。 -
path所在目录存在,客户端有写入权限。 -
filter先临时注释,排除正则筛空。 -
health-check.url使用轻量可访问地址。 - 分组里写的是
use,不是把 provider 名称塞进proxies。
排查时的优先级
遇到 Clash YAML provider 为空 相关问题时,先固定一个可复现样本,再改配置。不要凭感觉同时换设备、地区、账号和客户端。对“维护 Clash、Mihomo、Clash Verge Rev 或 OpenClash YAML 的用户”来说,最省时间的方法是按“现象、范围、最近变更、可回滚动作”四步记录。
| 步骤 | 要确认什么 |
|---|---|
| 现象 | 是报错、限速、空白页、扣费异常,还是权限不足 |
| 范围 | 只影响一个账号/设备,还是同一批任务都失败 |
| 变更 | 最近是否改过版本、地区、套餐、密钥或规则 |
| 回滚 | 能否回到上一个正常状态并复测 |
什么时候停止继续试错
如果同一问题连续试了三种方案仍无改善,先停下来整理证据。把错误截图、时间、账号地区、请求 id、订单号或配置片段放在一起,再决定是联系官方支持、换备用路径,还是回退到旧方案。客户端、协议、规则和网络工具配置 里的很多问题不是单点开关能解决,复盘记录比继续乱改更重要。
相关阅读
FAQ
provider 文件需要手动创建吗? 通常不需要,客户端会下载并缓存;但目录必须存在且可写。
为什么日志说更新成功,界面还是空? 可能 provider 有内容,但当前分组没有引用它,或被 filter 全部排除。
完整 Clash YAML 能当 provider 吗? 不建议。provider 只需要节点列表结构,完整配置应作为 profile 导入。