本文速览

Shadowrocket(小火箭)可以在 Global Routing 选择 Config 后,按当前配置的 Rule 段落分流。本文面向已经有自己的服务商与可用配置、只想让指定网站走代理的用户:先建立域名匹配规则,再以 FINAL,DIRECT 收尾,最后用请求记录核对实际命中。示例域名仅用于说明语法,不代表线路或服务推荐。

先确认 Config 与代理出口

规则分流需要同时满足两个条件:当前使用的配置中包含目标规则,Home 的 Global Routing 采用 Config。只在 Config 中编辑文件,并不等于所有流量已经按该文件分流;还要确认它是当前选中的配置。

Global Routing 中的 Proxy 是整体采用代理的姿态,Direct 是整体直连;这两者不用于验证本文的“指定网站代理、其余直连”方案。Scene 用于场景选择,也不能简单视为当前文件的 Config 模式。排查时先明确选中 Config,避免场景切换改变测试条件。

Config
Home → Global Routing 中用于本例的选择
2 类
本例出口:PROXY 与 DIRECT
最后 1 行
Rule 段落以 FINAL,DIRECT 兜底

PROXY 表示代理策略,通常使用当前选中的代理出口;DIRECT 表示直接连接目标。若现有文件使用自定义策略组,先核对组名与组内选择,不要把组名、服务器显示名称和内置策略混为一谈。本文只使用 PROXY、DIRECT,避免引入额外的组定义。

  1. 在 Home 选择已有的可用代理出口,并用 Connectivity Test 检查基本连通性。
  2. 进入 Config,先备份当前配置,再编辑用于本次测试的本地副本。
  3. 确认修改后的副本处于选中状态,回到 Home → Global Routing → Config。
  4. 开启连接后重新访问目标网站;已有连接可能继续使用先前的出口,不能作为新规则的验证依据。

DOMAIN-SUFFIX 与 FINAL 的最小写法

如果目标是让 example.com 及其子域名走代理,其余请求直连,核心规则只需要两行。下面展示的是独立的 Rule 段落示意,不是需要覆盖整个现有配置的完整文件。已有文件中若存在 [Rule],应编辑该段落,不要重复添加同名段落。

[Rule]
DOMAIN-SUFFIX,example.com,PROXY
FINAL,DIRECT

DOMAIN-SUFFIX,example.com,PROXY 按域名后缀匹配,覆盖 example.com 本身,以及 www.example.com、api.example.com 等子域名。填写的是域名,不包含 https://、端口或路径;不能写成完整网页地址,也不需要在域名前添加 *.。

FINAL,DIRECT 没有域名参数:当请求没有命中前面的规则时,它决定最终使用 DIRECT。它的含义是“剩余流量直连”,不是“先尝试直连,失败再自动改用代理”。如果希望增加第二个目标网站,应把新的域名规则放在 FINAL 前面。

DOMAIN-KEYWORD 适合什么情况

DOMAIN-KEYWORD 对域名中的关键词进行匹配,范围通常比 DOMAIN-SUFFIX 更宽。它不会按网页正文、网址路径或搜索内容匹配。例如下面的 media 会匹配域名中包含这一字符串的请求,而不是只匹配某一个站点。

[Rule]
DOMAIN,login.example.com,DIRECT
DOMAIN-SUFFIX,example.com,PROXY
DOMAIN-KEYWORD,media,PROXY
FINAL,DIRECT

这里第一行域名规则是一个有意设置的例外:login.example.com 直接连接;example.com 的其他匹配请求走代理;剩余域名若包含 media,也走代理。该示例用来说明范围与顺序,并非建议所有用户添加 media 关键词。只允许少数确定网站走代理时,优先使用 DOMAIN 或 DOMAIN-SUFFIX。

规则关键字匹配输入示例适用边界
DOMAINlogin.example.com精确匹配该域名,不自动覆盖其他子域名。
DOMAIN-SUFFIXexample.com匹配该域名及其子域名,适合按站点分流。
DOMAIN-KEYWORDmedia匹配域名中的字符串,可能覆盖原本不打算代理的域名。
FINAL无需域名参数承接此前没有命中的请求,应位于 Rule 段落末尾。

规则顺序:首条命中决定策略

Rule 段落按从上到下的顺序匹配。请求命中一条有效规则后,就采用该条规则的策略,而不是继续向下寻找“更精确”的规则。将精确例外放在宽泛范围之前,将 FINAL 放在末尾,是编排规则时最重要的约束。

新建请求获取目标顺序匹配首条命中执行策略

以上一节为例,如果把 DOMAIN-SUFFIX,example.com,PROXY 放到 DOMAIN,login.example.com,DIRECT 前面,login.example.com 就会先命中 PROXY,后面的 DIRECT 例外不会生效。类似地,FINAL 提前出现,会使后面的规则失去预期作用。

现有配置如果包含 RULE-SET、GEOIP 或 IP-CIDR,也要一起检查,而不是只看新添加的两行。它们若位于前面并率先命中,请求仍会按原策略处理。将新规则追加到文件最末尾,尤其是 FINAL 后面,并不能保证规则生效。

IP-CIDR、GEOIP 与域名分流的边界

DOMAIN-SUFFIX 处理域名,IP-CIDR 处理目标 IP 所在网段,GEOIP 按 IP 地理归属匹配。三者并不是同一种依据。只让少数网站走代理的场景,通常从域名规则开始更容易核对,因为同一个网站的 IP 可能改变,多个网站也可能共用同一地址。

IP-CIDR,192.0.2.0/24,DIRECT,no-resolve
GEOIP,CN,DIRECT
FINAL,DIRECT

这里的 192.0.2.0/24 是文档示例网段,不是需要照抄的实际网站地址。no-resolve 用于避免仅为匹配这条 IP 规则而主动进行域名解析,并不表示关闭所有 DNS。GEOIP,CN,DIRECT 则表达目标 IP 被归类为 CN 时直连;它不能代替“某个域名必须代理”的明确要求。

保存后按请求记录验证

Connectivity Test 有结果,只能说明相应测试条件下出口具备一定连通性,不能证明某个网站已经命中指定规则。应使用“目标网站、普通网站、例外域名”三类请求做对照,再在请求记录中核对目标、命中规则与策略。

  1. 保存配置,确认 Config 当前选中的是刚刚修改的文件。
  2. 确认 Home → Global Routing 仍为 Config;如果曾设置 Settings → On Demand,也检查自动触发是否改变了连接状态。
  3. 关闭目标页面的旧连接,必要时重新连接 Shadowrocket,再打开新的页面请求。
  4. 查看对应请求记录:目标域名应命中 DOMAIN-SUFFIX 或其他明确规则,策略应为 PROXY;未列入范围的域名应落到 FINAL 并使用 DIRECT。
  5. 发现资源失败时记录实际资源域名,不要只根据浏览器地址栏里的主域名判断。

下面是可能在网络错误或日志中见到的通用错误文本;具体显示形式随请求来源与系统而异。这些错误说明连接失败,不单独证明规则语法有误。先看命中策略,再判断是代理出口、直连路径还是目标服务的问题。

报错:Connection refused

原因:所连接的目标地址或代理端口拒绝了连接。解法:先核对请求命中的 PROXY 或 DIRECT,再检查对应地址与端口是否正确;代理出口信息应与用户已有服务商提供的配置一致。

报错:Operation timed out

原因:连接或响应未在限定时间内完成,可能涉及当前网络、出口或目标站点。解法:先执行 Connectivity Test,再对照同一网站的请求记录;若命中 FINAL,DIRECT 而本应代理,优先修正规则覆盖范围。

指定网站分流的常见问题

已经写了规则,为什么所有网站还是走代理?

先到 Home → Global Routing 确认选择 Config,而不是 Proxy。再检查当前 Config 是否有较早命中的宽泛 PROXY 规则,以及 FINAL 是否仍为 PROXY。每次只改一个条件,再用新请求验证,避免同时改多个设置后失去对照。

网页能打开,图片和登录却失败,应该加哪条规则?

先在请求记录里找失败资源的实际域名。如果它属于另一个独立域名,给该域名添加 DOMAIN 或 DOMAIN-SUFFIX 规则,并放在 FINAL 前面。不要因为页面的一部分失败就扩大到一个常见关键词,避免把无关网站一起纳入。

更新已有订阅后,自定义规则为什么不见了?

服务器订阅与远程 Config 是不同对象。更新服务器列表不等于修改 Rule;但重新获取远程配置可能覆盖该文件中的本地改动。把自定义规则保存在可控的本地副本中,更新后检查当前选中的 Config,并对比 Rule 段落。

换成另一种协议,需要重写 DOMAIN-SUFFIX 吗?

通常不需要。域名规则决定请求交给哪个策略,代理协议决定出口如何连接,两者职责不同。切换已有出口后,先确认 PROXY 指向可用选择,再检查同一目标是否仍命中原规则;不要用修改域名规则来掩盖出口连接故障。

最终保留一份最小、可解释的规则集:明确列出的站点使用 PROXY,必要例外排在前面,其余由 FINAL,DIRECT 处理。以后每增加一个域名,都同时验证一个应代理请求和一个应直连请求,比单纯观察连接开关更能确认配置结果。