这类故障要先把“下载规则文件”和“规则生效”拆开看。Mihomo 的 rule-providers 文档把远程 provider 写成 type: http,并用 url、path、interval、proxy、behavior、format 控制下载、落盘和解析;其中任意一段出错,界面都可能只显示更新失败或规则未变化。
我在 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 |
| 下载成功但解析失败 | behavior 或 format 与文件内容不匹配 | domain / ipcidr / classical、yaml / text / mrs |
| 文件变新但规则没命中 | 只更新文件,没有 reload 或规则名引用错 | RULE-SET 名称、规则顺序、debug 日志 |
| OpenClash 里路径找不到 | 相对路径落点和核心 HomeDir 不一致 | provider path、运行目录、权限 |
先抓第一个错误。下载阶段还没过时,不要先改 DNS 或规则顺序;解析失败还没修好时,也不要用网页能否打开来判断规则命中。
为什么 304 不等于更新失败?
HTTP 的 ETag 是服务端给某个资源版本的标识。客户端下次请求同一个 URL 时,可以带上 If-None-Match;如果服务端判断内容没变,就返回 304 Not Modified,意思是继续用本地缓存。
所以看到 304 时,要问三个问题:
- 远端文件是不是真的没变。
- Mihomo 本地
path里的文件是不是旧内容。 - 文件即使没变,当前规则是否已经被配置引用并重新加载。
用 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
重点看 ETag、Last-Modified、Cache-Control、Content-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 决定文件编码或容器格式。两者不匹配时,下载可能成功,加载却失败。
| 文件内容 | behavior | format | 常见错误 |
|---|---|---|---|
DOMAIN-SUFFIX,example.com,DIRECT 这类完整规则 | classical | yaml 或 text | 写成 domain 后解析或命中异常 |
| 纯域名列表 | domain | text 或 yaml | 当成 classical 后规则动作缺失 |
| CIDR 网段列表 | ipcidr | text 或 yaml | 域名规则和 IP 规则混在一个 provider |
| Mihomo MRS 文件 | domain 或 ipcidr | mrs | 用 classical 搭配 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 和缓存检查。
更新后怎么确认真的生效?
文件下载成功只是中间状态。验收要回到规则命中。
- 触发 provider update。
- 打开
path文件,确认内容、大小和 SHA256。 - 重载 Mihomo 配置,必要时重启核心。
- 选一个明确应该命中的域名或 IP。
- 打开 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、对象存储响应头和权限策略。