这类故障要先把“下载规则文件”和“规则生效”拆开看。Mihomo 的 rule-providers 文档把远程 provider 写成 type: http,并用 urlpathintervalproxybehaviorformat 控制下载、落盘和解析;其中任意一段出错,界面都可能只显示更新失败或规则未变化。

我在 2026-05-24 查看官方文档和 MetaCubeX/mihomo release 时,最新正式版页面是 v1.19.25,发布时间为 2026-05-16。本文不判断某个第三方规则源是否可靠,只处理 Mihomo 侧能验证的字段、缓存和日志。

##看日志像哪一类问题?

日志或表现更可能原因第一处处理
URL 返回 404、403、timeout规则源不可达、权限不对或下载出站错误curl -I、provider proxy
返回 304,但本地规则没变服务端认为缓存可复用ETag、Last-Modified、本地 path
下载成功但解析失败behaviorformat 与文件内容不匹配domain / ipcidr / classicalyaml / text / mrs
文件变新但规则没命中只更新文件,没有 reload 或规则名引用错RULE-SET 名称、规则顺序、debug 日志
OpenClash 里路径找不到相对路径落点和核心 HomeDir 不一致provider path、运行目录、权限

先抓第一个错误。下载阶段还没过时,不要先改 DNS 或规则顺序;解析失败还没修好时,也不要用网页能否打开来判断规则命中。

为什么 304 不等于更新失败?

HTTP 的 ETag 是服务端给某个资源版本的标识。客户端下次请求同一个 URL 时,可以带上 If-None-Match;如果服务端判断内容没变,就返回 304 Not Modified,意思是继续用本地缓存。

所以看到 304 时,要问三个问题:

  1. 远端文件是不是真的没变。
  2. Mihomo 本地 path 里的文件是不是旧内容。
  3. 文件即使没变,当前规则是否已经被配置引用并重新加载。

curl 做第一层确认:

curl -I "https://example.com/rules/direct.yaml"
curl -L "https://example.com/rules/direct.yaml" -o /tmp/direct.yaml
shasum -a 256 /tmp/direct.yaml

重点看 ETagLast-ModifiedCache-ControlContent-Length。如果你刚推了规则仓库,但这些头没变,问题更可能在规则源、CDN 或发布流程,不在 Mihomo。

path 缓存文件要怎么查?

Mihomo 文档说明 path 是可选字段;不写时会按 URL 的 MD5 生成文件名。自动运行没问题,但排错时很难找文件。建议临时显式写清楚:

rule-providers:
  dev-rules:
    type: http
    behavior: classical
    format: yaml
    url: https://example.com/rules/dev.yaml
    path: ./ruleset/dev.yaml
    interval: 86400
    proxy: DIRECT

触发更新后,直接打开 ./ruleset/dev.yaml,比对三件事:文件内容是不是新版本,修改时间是否变化,文件里有没有 HTML、错误页或登录提示。

相对路径还要看 Mihomo 的 HomeDir。OpenClash、Docker、systemd、桌面客户端的运行目录可能不同,同一个 ./ruleset/dev.yaml 不一定落在你以为的目录。文档还提到出于安全原因,路径默认受 HomeDir 限制,额外目录要通过 SAFE_PATHS 放行。

behavior 和 format 哪个更容易写错?

behavior 决定 Mihomo 如何理解规则内容,format 决定文件编码或容器格式。两者不匹配时,下载可能成功,加载却失败。

文件内容behaviorformat常见错误
DOMAIN-SUFFIX,example.com,DIRECT 这类完整规则classicalyamltext写成 domain 后解析或命中异常
纯域名列表domaintextyaml当成 classical 后规则动作缺失
CIDR 网段列表ipcidrtextyaml域名规则和 IP 规则混在一个 provider
Mihomo MRS 文件domainipcidrmrsclassical 搭配 mrs

不要靠文件名猜格式,把远端文件下载到临时目录,用编辑器打开;如果是二进制 MRS,至少确认 URL、大小和生成命令来自可信流程。Mihomo 文档写明 mrs 当前只支持 domain / ipcidr 两类 behavior。

下载 detour 应该看 proxy 字段

sing-box 旧配置里常见 download_detour 这个词,Mihomo 的 rule-providers 对应字段是 proxy。它的意思是下载或更新 provider 时通过指定出站执行。

排查时优先避免依赖回环:某个 provider 的下载需要策略组 A,策略组 A 又依赖这个 provider 才能选出规则。最小化验证时可以先写 proxy: DIRECT,确认规则源在当前网络环境能直接请求;如果必须走某个已存在的出站,再指定一个启动时就可用的代理名称或策略组。

多端配置里还要注意命名差异。手机端、桌面端、软路由 UI 可能会把策略组改名,导致 provider proxy 指向不存在的名称。下载失败时别只看规则 URL,也要看日志里实际使用的出站名称。

什么时候适合用一份基线订阅?

如果同一个规则 URL 在桌面端能更新,在软路由里失败,先固定变量:同一个 Mihomo 版本、同一个 provider 片段、同一个测试域名、同一个下载出站。不要同时替换规则源、订阅、DNS 和策略组。

团队或多设备维护时,可以准备一份兼容 Clash / Singbox / V2Ray 的订阅作为基线输入,先验证客户端能正常导入、策略组名称稳定,再单独排查 rule-provider。订阅只负责基线连接和格式,不替代规则源、ETag 和缓存检查。

更新后怎么确认真的生效?

文件下载成功只是中间状态。验收要回到规则命中。

  1. 触发 provider update。
  2. 打开 path 文件,确认内容、大小和 SHA256。
  3. 重载 Mihomo 配置,必要时重启核心。
  4. 选一个明确应该命中的域名或 IP。
  5. 打开 debug 日志,看是否出现预期 RULE-SET 名称。

如果日志仍走到 MATCH 或 final 兜底,就算文件时间变新也没完整链路。继续查 provider 名称、规则顺序、RULE-SET,dev-rules,策略组 里的名称是否和 rule-providers 顶层 key 完全一致。

哪些限制不要写成确定结论?

GitHub issue 里能看到用户报告 provider 文件变化后没有自动更新的场景,也能看到 OpenWrt、OpenClash、Linux arm64 这类运行环境差异。社区 issue 适合当排查线索,不适合直接写成所有版本的通病。

本文没有覆盖所有面板 UI 的按钮名称,也没有测试每个第三方规则源的 CDN 行为。若你维护的是自建规则仓库,最终还要检查发布动作、CDN purge、对象存储响应头和权限策略。

相关阅读