Stash 主界面底部的「规则集」旁边亮了一个红点,点进去看到某个 rule-provider 显示「更新失败」——这是 iOS 代理用户最常见的报错之一。很多人第一反应是「网络不好」然后来回切节点,但实际原因很可能跟节点没关系。

下面按四种最常见的失败原因拆开,每种都有对应的快速确认方法和修复方案。

先确认:URL 返回的到底是什么?

这是最关键的一个检查。大多数「更新失败」的原因是 Stash 访问远程 URL 时拿到的不是规则内容,而是一个 HTML 错误页或登录页。

你能在浏览器看到什么说明怎么修
纯文本 YAML(以 payload: 开头)URL 和内容都没问题,问题在 Stash 配置检查 format/behavior 声明
「404: Not Found」HTML 页面规则集文件被删除或路径改了去规则集仓库确认最新文件路径
GitHub 网页(带导航栏和文件列表)你用错了 URL——用了 github.com 而非 raw.githubusercontent.com点页面上的「Raw」按钮,复制 raw 地址
连接超时 / 空白页raw.githubusercontent.com DNS 被污染或 TCP 不可达换 jsDelivr CDN 地址或加代理规则
403 或 Rate Limit 提示GitHub 对频繁请求做了速率限制把 interval 拉长到 86400,或换 CDN

在 Stash 里找到对应 rule-provider 的 url 字段,复制到 Safari 地址栏打开。这一步 30 秒做完就能排除 60% 的误判。

GitHub raw URL 不可达:DNS 与 CDN 替换方案

raw.githubusercontent.com 在国内网络下经常打不开,原因有三层:

  1. DNS 污染:部分 DNS 服务器返回错误的 IP
  2. TCP 阻断:解析正确但 443 端口 SYN 包被丢弃
  3. SNI 阻断:TLS 握手时 Client Hello 里的 SNI 域名触发了阻断规则

如果 Stash 自己就在跑代理,为什么 GitHub raw URL 还会失败?因为 Stash 的 rule-provider 更新请求走的不是规则的代理路径——它是在 Stash 内部进程里发起的 HTTP 请求,默认走 DIRECT(直连),不受你当前分流规则的管辖。

解决途径有三个,按推荐顺序:

方法操作优缺点
换 jsDelivr CDNraw.githubusercontent.com/用户/仓库/分支/路径cdn.jsdelivr.net/gh/用户/仓库@分支/路径国内 CDN 节点多、免费、更新有缓存延迟(几小时到 24 小时)
手动加 rule-provider 代理在 Stash 配置里把 raw.githubusercontent.com 的域名匹配到代理策略组更新即时,但要确保代理本身稳定
用 GitHub 镜像raw.githubusercontent.comraw.fastgit.orgghproxy.net/原始URL免费但有速率限制或被镜像站运营方随时关停

最省心的方式是全部规则集换到 jsDelivr CDN。如果对更新及时性要求很高(比如规则集每天更新多次),保留 GitHub raw URL 并在 Stash 里加域名代理规则。

规则集格式:最容易遗漏的 formatbehavior

Stash 的 rule-provider 配置块需要声明两样东西:

rule-providers:
  proxy-domain:
    type: http
    behavior: domain
    format: text    # 或 yaml
    url: "https://cdn.jsdelivr.net/gh/Loyalsoldier/clash-rules@release/proxy.txt"
    path: "./rulesets/proxy-domain.yaml"
    interval: 86400

检查清单:

  • behavior 写了没?值是 domainipcidr 还是 classical
  • format 写了没?值是 text(每行一个域名)还是 yaml(完整的规则集 YAML 结构)
  • path 指定的目录是否存在?Stash 不会自动创建目录

如果 rule-provider 的 URL 返回的是 txt 格式(每行一个域名,如 Loyalsoldier 的规则),format 必须写 text。如果返回的是 yaml(如 ACL4SSR 的规则),formatyamlformat 与实际文件内容不匹配时 Stash 会报 Invalid 错误。

Stash 3.0 新增语法:旧的规则集可能不兼容

Stash 3.0(2025 年大版本)引入了 AND/OR/NOT 逻辑规则和 DOMAIN-WILDCARD 等新规则类型。如果你的 Stash 已经更新到 3.0+ 但引用的规则集还是旧版格式,一般向下兼容没问题。但反过来——规则集作者用了 3.0 独有的语法而你的 Stash 版本低于 3.0——就会解析失败。

确认 Stash 版本:打开 Stash → 「设置」→ 「关于」。当前最新版是 3.0.2(截至 2026 年 5 月)。如果低于 3.0,先在 App Store 更新。

另外,Stash 3.0 优化了远程资源的批量更新性能,如果你之前一次更新 10+ 个 rule-provider 经常超时,升级到 3.0+ 后会有改善。

DNS 层的问题:规则集域名本身解析不到

即使你的代理正常工作,Stash 更新规则集时对 raw.githubusercontent.com 做 DNS 解析可能仍然走了本地 DNS。如果本地 DNS 返回了错误的 IP,TCP 连接就直接失败了。

确认方法是:在 Stash 连接的终端/SSH 工具里跑 nslookup raw.githubusercontent.com(如果 iPhone 不方便,在 Mac 上先查)。如果返回的 IP 是 0.0.0.0 或 127.0.0.1,说明 DNS 被投毒。换成 DoH(DNS over HTTPS)或者直接用 jsDelivr 的域名替代,不走被污染的域名。

订阅和规则集都跑在代理上,但更新依然失败?

排查到这里还有一个容易被忽略的场景:Stash 本身依赖的订阅(Proxy Provider)也面临同样的问题。如果你的 proxy-providers 的 URL 也指向 raw.githubusercontent.com 或某个境外域名,更新同样会失败,表现为「节点为空」或「Proxy Provider 更新超时」。

这种情况下,不仅是规则集要换 CDN,订阅源的 URL 也需要换成可直连的地址。

如果你正在选订订阅,优先找提供 sing-box/Clash 多格式导出且源 URL 在国内有 CDN 分发节点的。更新失败少一次,代理稳定的时间就多一天。需要一套可以直接导入 Stash 且原生兼容 Clash Meta 格式的兼容 Clash / Singbox / V2Ray 的订阅作为主配置源。

相关阅读