FlClash 更新 rule provider 失败时,别先重装客户端。先把 provider URL 单独下载成文件,确认 GitHub raw 返回的是规则内容而不是 HTML、404 或 release 页面;再看日志里的 HTTP 状态、本地 pathbehavior/formatinterval

Mihomo 的 provider 字段包括 typeurlpathintervalproxybehaviorformat;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 assethttps://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 / 403GitHub 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 状态、ETagLast-ModifiedCache-ControlContent-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

这里有四个容易写错的点:

  1. github-classical 必须和 RULE-SET 里的名称完全一致。
  2. path 指向本地缓存文件,排错时要能直接打开它。
  3. proxy 是下载 provider 用的出站,不是规则命中后的策略。
  4. interval 单位是秒,86400 表示一天。

如果 rules 引用了 RULE-SET,github-classic,Proxy,而 provider 叫 github-classical,文件可以更新,规则仍然不会被这条引用命中。

behavior 写 domain、ipcidr 还是 classical?

behavior 决定 Mihomo 怎么理解规则内容。不要靠文件名猜,直接打开下载后的文件看内容。

文件内容behaviorformat常见误写
DOMAIN-SUFFIX,example.com,Proxyclassicalyamltext写成 domain 后动作字段多余
一行一个域名或域名后缀domaintextyaml写成 classical 后缺少策略动作
192.0.2.0/24 这类网段ipcidrtextyaml和域名规则混在同一 provider
.mrs 文件domainipcidrmrsclassical 搭配 mrs

classical 更像完整规则行;domainipcidr 更像纯集合。FlClash 端只看到更新失败时,日志里未必会解释得很细,最可靠的方法仍是下载本地 path 文件后对照 behavior

cache、ETag 和 path 要怎样一起看?

ETag 是服务端给资源版本的标识。客户端下次请求时,服务端可能返回 304 Not Modified,表示继续使用本地 cache。这个结果不等于失败,但它会让“远端已经改了,本地还没变”的问题更难判断。

排查顺序建议这样走:

  1. curl -I 看远端 ETagLast-Modified
  2. 打开 YAML 里 path 指向的本地文件。
  3. 比对文件内容、修改时间和 SHA256。
  4. 备份后删除本地 provider 文件,再触发一次更新。
  5. 如果仍拿到旧内容,再看 GitHub 分支、CDN 或发布动作。

相对路径还要看 FlClash / Mihomo 的运行目录。桌面端、Android 沙箱、Linux AppImage 和 system service 的落点可能不同,同一个 ./ruleset/github-classical.yaml 不一定在你以为的目录里。

interval 太短会不会让更新看起来更乱?

会。排错阶段把 interval 临时改短,可以更快触发下载;确认问题后要调回正常周期。对放在 GitHub raw 上的规则文件来说,几分钟拉一次通常只会放大 cache、限流和日志噪声。

比较稳的做法是:排错时手动触发 provider update,修好后把 interval 放回 36002160086400 这类可解释的值。规则仓库如果只在每天构建一次,本地每 5 分钟请求一次没有收益。

多端配置卡住时,哪一段适合固定下来?

如果你的规则源和订阅源来自不同团队,FlClash 端会同时出现主 profile、provider、策略组名称、下载出站这几组变量。多人维护时先拿一份已经确认能在 FlClash 导入的配套订阅线路做基线,只用于确认 profile、策略组名称和更新出站一致;rule provider 的 GitHub URL、ETag 和 YAML 仍要单独排查。

这个动作的目的不是替换规则源,而是减少变量。基线 profile 能导入、策略组能显示、日志能看到请求后,再把注意力放回 provider 文件本身。

修完以后用哪几步验收?

只看到 FlClash 界面提示更新完成还不够。真正验收要看文件和命中链。

  1. 手动触发 rule provider 更新。
  2. 打开 path 文件,确认内容不是 HTML、404 或旧版本。
  3. 重载 FlClash 配置,必要时重启 Mihomo core。
  4. 选一个应该命中该 provider 的域名或 IP。
  5. 打开日志,确认出现预期 RULE-SET 名称。
  6. 再测一个不应该命中的样本,避免规则顺序把流量提前截走。

如果第 2 步失败,继续查 URL、cache 和 GitHub 发布链路。如果第 5 步失败,继续查 provider 名称、behaviorrules 顺序和策略组名称。

相关阅读