FlClash 更新 rule provider 失败时,别先重装客户端。先把 provider URL 单独下载成文件,确认 GitHub raw 返回的是规则内容而不是 HTML、404 或 release 页面;再看日志里的 HTTP 状态、本地 path、behavior/format 和 interval。
Mihomo 的 provider 字段包括 type、url、path、interval、proxy、behavior、format;FlClash Release 页提供 Android、Windows、macOS、Linux 安装包。本文只处理这些字段能定位的问题,不判断第三方规则仓库是否长期维护。
GitHub URL 先分 raw、blob、release 三种
FlClash 最终交给 Mihomo 读取 provider,Mihomo 需要拿到可解析的规则文件。GitHub 上最常见的误判,是把浏览器能打开的网页链接当成规则文件链接。
| URL 类型 | 典型长相 | 适合放进 provider 吗 | 先看什么 |
|---|---|---|---|
| raw 文件 | https://raw.githubusercontent.com/owner/repo/main/rules.yaml | 适合 | 返回内容是不是 YAML 或 text 规则 |
| blob 页面 | https://github.com/owner/repo/blob/main/rules.yaml | 不适合 | 返回的是网页 HTML |
| release asset | https://github.com/owner/repo/releases/download/v1/rules.yaml | 看发布方式 | 是否固定版本、是否需要跟随更新 |
| release 页面 | https://github.com/owner/repo/releases/tag/v1 | 不适合 | 返回的是 release 说明页 |
排错时先用命令保存文件:
curl -L "https://raw.githubusercontent.com/owner/repo/main/rules.yaml" -o /tmp/flclash-rules.yaml
head -n 20 /tmp/flclash-rules.yaml
如果第一屏出现 <html>、404: Not Found、登录提示或说明页,问题在 URL,不在 FlClash。GitHub Docs 也把 raw 视图定义为不带页面样式的文件内容;rule provider 需要的正是这一类响应。
日志里的 404、304 和 parse error 分别指向哪里?
同一个“更新失败”提示,背后可能是下载、缓存、解析或命中四段问题。先抓最早出现的一条日志,不要一边改 URL,一边清 cache,一边换规则格式。
| 日志或表现 | 更可能原因 | 第一处处理 |
|---|---|---|
404 / 403 | GitHub URL 错、私有仓库、文件路径变了 | 用浏览器和 curl -I 打开 URL |
timeout | 当前下载出站不可用,或系统网络权限异常 | 看 provider 的 proxy 字段和 FlClash 网络权限 |
304 Not Modified | 服务端认为本地 cache 仍可用 | 对比 ETag、本地 path 文件和文件时间 |
parse error | 文件内容与 behavior / format 不匹配 | 打开本地 provider 文件看第一屏 |
| 更新成功但规则不命中 | RULE-SET 名称或规则顺序错 | 看 debug 日志里的命中规则集 |
在 Windows 上可用 PowerShell 保存响应头;macOS / Linux 用 curl -I 更直接:
curl -I -L "https://raw.githubusercontent.com/owner/repo/main/rules.yaml"
重点看 HTTP 状态、ETag、Last-Modified、Cache-Control、Content-Length。如果返回 200 但内容长度只有几十字节,通常不是完整规则文件。
YAML 里的 rule-providers 怎么写才像 Mihomo?
Mihomo 的 rule-providers 不是随便填一个 URL。至少要让下载地址、本地落盘、更新周期、解析方式和规则引用名对应起来。
rule-providers:
github-classical:
type: http
url: https://raw.githubusercontent.com/owner/repo/main/rules/classical.yaml
path: ./ruleset/github-classical.yaml
interval: 86400
proxy: DIRECT
behavior: classical
format: yaml
rules:
- RULE-SET,github-classical,Proxy
- MATCH,DIRECT
这里有四个容易写错的点:
github-classical必须和RULE-SET里的名称完全一致。path指向本地缓存文件,排错时要能直接打开它。proxy是下载 provider 用的出站,不是规则命中后的策略。interval单位是秒,86400表示一天。
如果 rules 引用了 RULE-SET,github-classic,Proxy,而 provider 叫 github-classical,文件可以更新,规则仍然不会被这条引用命中。
behavior 写 domain、ipcidr 还是 classical?
behavior 决定 Mihomo 怎么理解规则内容。不要靠文件名猜,直接打开下载后的文件看内容。
| 文件内容 | behavior | format | 常见误写 |
|---|---|---|---|
DOMAIN-SUFFIX,example.com,Proxy | classical | yaml 或 text | 写成 domain 后动作字段多余 |
| 一行一个域名或域名后缀 | domain | text 或 yaml | 写成 classical 后缺少策略动作 |
192.0.2.0/24 这类网段 | ipcidr | text 或 yaml | 和域名规则混在同一 provider |
.mrs 文件 | domain 或 ipcidr | mrs | 用 classical 搭配 mrs |
classical 更像完整规则行;domain 和 ipcidr 更像纯集合。FlClash 端只看到更新失败时,日志里未必会解释得很细,最可靠的方法仍是下载本地 path 文件后对照 behavior。
cache、ETag 和 path 要怎样一起看?
ETag 是服务端给资源版本的标识。客户端下次请求时,服务端可能返回 304 Not Modified,表示继续使用本地 cache。这个结果不等于失败,但它会让“远端已经改了,本地还没变”的问题更难判断。
排查顺序建议这样走:
- 用
curl -I看远端ETag和Last-Modified。 - 打开 YAML 里
path指向的本地文件。 - 比对文件内容、修改时间和 SHA256。
- 备份后删除本地 provider 文件,再触发一次更新。
- 如果仍拿到旧内容,再看 GitHub 分支、CDN 或发布动作。
相对路径还要看 FlClash / Mihomo 的运行目录。桌面端、Android 沙箱、Linux AppImage 和 system service 的落点可能不同,同一个 ./ruleset/github-classical.yaml 不一定在你以为的目录里。
interval 太短会不会让更新看起来更乱?
会。排错阶段把 interval 临时改短,可以更快触发下载;确认问题后要调回正常周期。对放在 GitHub raw 上的规则文件来说,几分钟拉一次通常只会放大 cache、限流和日志噪声。
比较稳的做法是:排错时手动触发 provider update,修好后把 interval 放回 3600、21600 或 86400 这类可解释的值。规则仓库如果只在每天构建一次,本地每 5 分钟请求一次没有收益。
多端配置卡住时,哪一段适合固定下来?
如果你的规则源和订阅源来自不同团队,FlClash 端会同时出现主 profile、provider、策略组名称、下载出站这几组变量。多人维护时先拿一份已经确认能在 FlClash 导入的配套订阅线路做基线,只用于确认 profile、策略组名称和更新出站一致;rule provider 的 GitHub URL、ETag 和 YAML 仍要单独排查。
这个动作的目的不是替换规则源,而是减少变量。基线 profile 能导入、策略组能显示、日志能看到请求后,再把注意力放回 provider 文件本身。
修完以后用哪几步验收?
只看到 FlClash 界面提示更新完成还不够。真正验收要看文件和命中链。
- 手动触发 rule provider 更新。
- 打开
path文件,确认内容不是 HTML、404 或旧版本。 - 重载 FlClash 配置,必要时重启 Mihomo core。
- 选一个应该命中该 provider 的域名或 IP。
- 打开日志,确认出现预期
RULE-SET名称。 - 再测一个不应该命中的样本,避免规则顺序把流量提前截走。
如果第 2 步失败,继续查 URL、cache 和 GitHub 发布链路。如果第 5 步失败,继续查 provider 名称、behavior、rules 顺序和策略组名称。