raw.githubusercontent.com 下载失败时,把问题拆成三类:GitHub 原始文件是否存在、客户端有没有把请求发出去、下载后的内容是否可信。规则源和普通 README 不一样,错误规则会直接影响分流结果,所以排查顺序要比“能打开就行”更严格。
这里只讨论公开仓库里的规则源、远程 rule-set、配置片段和脚本文件。私有仓库 token、公司内网策略、未授权访问不在这里处理;如果文件包含凭据,同样不要经过第三方转发域名。
##判断你卡在哪一层?
用同一个 URL 做三次检查:浏览器打开 GitHub 文件页、终端请求 raw 地址、客户端手动更新规则源。三处结果不一致,说明不是 GitHub 单点问题,而是 DNS、出站、缓存或客户端配置差异。
| 表现 | 更可能原因 | 第一条检查命令或动作 |
|---|---|---|
| GitHub 文件页存在,raw 返回 404 | 分支名、大小写或路径错 | 从 GitHub 文件页点 Raw 重新复制地址 |
| raw 返回 403 | 私有资源、请求限额、组织策略或认证缺失 | 降低自动刷新频率,必要时改用 GitHub Contents API |
curl 超时,浏览器偶尔能打开 | DNS、TLS、CDN 边缘节点或本机出站差异 | curl -I -L --connect-timeout 5 <raw-url> |
| 客户端更新失败,终端能下载 | rule-provider / rule-set 没走同一出站 | 查 Mihomo proxy 或 sing-box http_client |
| 下载成功但规则不生效 | 文件格式、behavior 或缓存旧内容 | 校验 format、behavior、SHA256 和客户端缓存 |
不要一上来就改成第三方域名。规则源失败最常见的根因是 404、格式不匹配、缓存旧文件和客户端没有按预期出站,直接替换 URL 反而会把问题藏起来。
404、403、302、304 分别说明什么?
GitHub Docs 里,仓库 Contents API 的相关响应状态包括 200、302、304、403、404。raw 文件本身没有一页专门列完整状态码,但这些状态足够覆盖规则源排查里的主干判断。
| HTTP 状态 | 在规则源场景里的含义 | 该做什么 |
|---|---|---|
200 | 文件当前可下载 | 保存响应头、计算 SHA256,再看客户端格式 |
302 | GitHub 或 API 返回跳转 | curl 加 -L,确认最终落点不是错误页 |
304 | 条件请求命中缓存 | 清客户端缓存或换 commit URL 复测 |
403 | 权限、限额或策略问题 | 检查是否私有仓库;高频任务改用认证 API |
404 | 路径、分支、文件名或仓库可见性问题 | 回到 GitHub 文件页复制 Raw 地址 |
| 连接超时 | 还没拿到 HTTP 响应 | 查 DNS、TLS 握手、本机出站和客户端出站 |
GitHub 在 2025-05-08 的 Changelog 里明确提到,未认证请求限制覆盖 raw.githubusercontent.com 文件下载。CI、定时任务、多个客户端同时每几分钟刷新一次规则源时,不要把所有失败都归因于“源不可用”。
DNS、CDN 和缓存怎么分开测?
同一条 raw URL,用 curl 拆成响应头、下载内容、校验值三步。这样能区分“连不上”“拿到错误页”“拿到旧内容”三种情况。
RAW_URL="https://raw.githubusercontent.com/owner/repo/main/rules/example.yaml"
curl -I -L --connect-timeout 5 --max-time 20 "$RAW_URL"
curl -fsSL --connect-timeout 5 --max-time 30 "$RAW_URL" -o /tmp/example.yaml
shasum -a 256 /tmp/example.yaml
如果第一条命令没有 HTTP 状态,问题在 DNS、TLS 或出站链路。此时看客户端日志没有意义,因为客户端也只是重复同一个失败连接。
如果响应是 200,但文件内容是 HTML 错误页、登录页或空文件,说明 URL 指向的不是有效规则源。规则文件通常应该是 YAML、text、mrs、json 或 srs,而不是一整段网页。
如果 SHA256 每次都变,但 GitHub 仓库没有提交变化,优先怀疑中间缓存或下载到了动态错误页。安全做法是把规则源固定到 commit SHA,而不是长期使用浮动分支名。
Mihomo rule-provider 应该看哪些字段?
Mihomo 官方 rule-providers 文档把 HTTP 规则源写成 type: http,并通过 url 下载。interval 是更新间隔,单位是秒;proxy 可以指定更新规则源时使用的代理组或节点;behavior 支持 domain、ipcidr、classical;format 支持 yaml、text、mrs,默认是 yaml。
一个最小排查样例可以这样读:
rule-providers:
github_rules:
type: http
behavior: classical
format: yaml
url: "https://raw.githubusercontent.com/owner/repo/main/rules.yaml"
path: ./ruleset/github_rules.yaml
interval: 86400
proxy: PROXY
排查顺序是固定的,把 url 拿到终端下载;再确认 behavior 和文件内容匹配;最后检查 proxy 是否真的存在于当前配置里。proxy 写了一个不存在的策略组时,日志里常见的是更新失败,而不是规则语法错误。
mrs 文件要额外小心。Mihomo 文档说明 mrs 当前只支持 domain 和 ipcidr,不支持 classical。如果你把 classical 规则转换成 mrs 再给 rule-provider 使用,下载成功也可能加载失败。
sing-box remote rule-set 要怎么排查?
sing-box 的 remote rule-set 使用 url 拉取远程规则,format 可以是 source 或 binary,扩展名是 .json 或 .srs 时通常可以省略。update_interval 默认是 1d。
sing-box 1.14.0 起,文档标注 download_detour 已废弃,并计划在 1.16.0 移除;新配置应该检查 http_client。如果旧教程还让你只改 download_detour,看本机 sing-box 版本和配置 schema。
| 字段 | 重点 | 排查动作 |
|---|---|---|
url | 远程规则地址 | 用 curl -fsSL 直接下载同一 URL |
format | source 或 binary | JSON 用 source,SRS 用 binary 或扩展名自动判断 |
update_interval | 默认 1d | 避免过短刷新造成高频失败 |
http_client | 1.14.0 起推荐检查 | 确认下载规则源走的是预期出站 |
| cache file | 远程规则可缓存 | 怀疑旧内容时清缓存再重启 |
如果配置迁移后突然更新失败,先不要改规则内容。把 sing-box 版本号、format、http_client 和缓存文件状态列出来,通常比反复换 URL 更快。
什么时候用 GitHub Contents API?
自动化脚本、CI、后台定时任务不适合长期裸拉 raw 地址。GitHub REST Contents API 会返回文件对象和 download_url,官方文档提醒 download_url 会过期,并且应该每次需要时重新获取。
对于高频任务,更稳妥的流程是,用认证请求访问 Contents API,拿到当前文件的 metadata,再下载 raw 内容。这样能减少未认证请求限额带来的 403,也能把 404 和权限问题记录得更清楚。
Contents API 还有大小限制:1 MB 到 100 MB 的文件只支持 raw 或 object media type,超过 100 MB 不由这个端点支持。规则源通常远小于这个范围,但大型列表、合并规则或误把二进制文件当规则源时,仍然要看文件大小。
安全回退怎么做才不埋坑?
规则源的安全回退不是“随便找一个可打开的地址”。更稳的做法是保留原始 GitHub 地址、记录 commit SHA、保存本地缓存,并用 SHA256 或 Git commit 校验内容。
| 回退方式 | 适合场景 | 风险控制 |
|---|---|---|
| 固定 commit raw URL | 规则变化不频繁 | 定期人工更新 commit,不用浮动分支当生产源 |
| 本地缓存文件 | 客户端离线或 raw 短时失败 | 文件名写日期和 SHA256,恢复后再同步 |
| GitHub Contents API | 脚本、CI、后台同步 | 用认证请求,重新获取 download_url |
| 客户端指定出站 | Mihomo / sing-box 规则源更新 | 只给下载动作指定出站,不改规则文件含义 |
| 临时备用下载域名 | 原始源短时不可达且文件公开 | 只用于公开文件;下载后比对 SHA256 |
多端客户端一起维护时,最容易出问题的是“订阅能更新,规则源不能更新”,或者反过来。若同一台设备长期维护 Clash、Mihomo、sing-box、V2Ray 多套配置,可以把订阅导入和规则源下载放进同一套可审计的客户端流程;需要多端协议兼容时,再考虑用兼容 Clash / Singbox / V2Ray 的订阅承载订阅导入,规则源仍保留官方 raw 或固定 commit 地址。
客户端日志怎么读?
日志不要只看最后一行。先找 provider 名称、URL、HTTP 状态、保存路径和解析错误,再判断是下载失败还是加载失败。
| 日志关键词 | 代表阶段 | 下一步 |
|---|---|---|
timeout / context deadline exceeded | 连接阶段 | 测 DNS、TLS、客户端出站 |
403 / rate limit | HTTP 响应阶段 | 降低刷新频率或改用认证 API |
404 / not found | HTTP 响应阶段 | 回 GitHub 文件页复制 Raw 地址 |
yaml / parse | 内容解析阶段 | 检查 behavior、format 和文件内容 |
checksum / hash | 校验阶段 | 对比预期 SHA256,清缓存后重下 |
cache / use local | 缓存阶段 | 确认客户端是否用了旧规则 |
如果日志只说 update failed,没有更多上下文,把客户端日志级别临时调高,复现一次手动更新,再恢复原级别。不要长时间开 debug;规则源刷新频率高时,debug 日志会很快堆满磁盘。
如何确认已经修好?
修好不是“按钮变绿”,而是三项同时成立:raw URL 能拿到 200 或有效跳转,文件 SHA256 与预期一致,客户端日志显示 provider 或 rule-set 已重新加载。
建议留一条最小记录:URL、commit、SHA256、客户端版本、更新时间和最终日志行。下次失败时可以直接判断是 GitHub 源变化、客户端升级影响,还是本地网络链路变化。
RAW_URL="https://raw.githubusercontent.com/owner/repo/<commit>/rules/example.yaml"
curl -fsSL "$RAW_URL" -o /tmp/example.yaml
shasum -a 256 /tmp/example.yaml
如果你只能用浮动分支名,比如 main,至少把上一次成功下载的文件保存在本地。规则源短时更新失败时,客户端继续使用旧缓存,比加载一份来源不明的新规则更安全。