本文面向已经在 Shadowrocket(小火箭)中配置好连接、准备修改分流规则的用户。先确认 Global Routing 使用 Config,再按“具体例外在前、范围规则在后、FINAL 最后”的顺序整理配置,并通过单次请求记录核对实际命中结果。连接信息与订阅从你的服务商处获取;本文只说明规则的编排、验证与回退方法。
先确认 Config:规则顺序生效的前提
修改规则前,先在 Home → Global Routing 检查当前姿态。本文讨论的是选择 Config 后,当前配置中 [Rule] 列表的匹配顺序。只修改文件、却让 Global Routing 停在 Proxy 或 Direct,不能用来验证这套规则是否按预期生效。
Global Routing 的姿态名称与规则行里的策略名称不是同一层设置。例如,Proxy 是路由姿态,PROXY 则是规则行的目标策略。两者拼写接近,但不要把“选中 Proxy”理解为“只让 PROXY 规则生效”。
Config
推荐按当前配置执行分流。请求可能由某条具体规则处理,也可能落到 FINAL;最终走哪条路径由命中的策略决定。
适合:编辑规则、核对命中顺序与日常按配置分流。
Proxy
以代理姿态处理流量,不按本文的规则列表逐条决定分流。可用于对照代理连接本身是否可用,但不能据此证明规则正确。
适合:临时对照连接可用性,区分代理故障与规则选择错误。
Direct
以直连姿态处理流量。此时访问成功或失败,不能直接归因于刚刚修改的 PROXY 或 REJECT 规则。
适合:核对本地网络的直连表现,完成对照后切回 Config。
判断:先固定姿态,再改一条规则
把 Global Routing 固定为 Config,并保持所选连接不变;每轮只调整一条规则或一个位置。这样才能把请求路径的变化与本次修改对应起来。
从上到下匹配:更具体不代表自动优先
在普通规则列表中,Shadowrocket 按自上而下的顺序检查规则。一旦某条规则命中并决定处理策略,就不再继续寻找下面“看起来更精确”的规则。优先级主要来自排列位置,而不是域名长短,也不是 DIRECT、PROXY 或 REJECT 的名称。
以下使用保留的示例域名说明冲突关系,不代表可直接访问的测试服务。假设整个 example.com 需要 PROXY,但其中 api.example.com 是一个需要 DIRECT 的例外,例外必须放在范围规则前面。
[Rule]
DOMAIN,api.example.com,DIRECT
DOMAIN-SUFFIX,example.com,PROXY
FINAL,DIRECT
api.example.com:先命中第一行,执行 DIRECT;不再检查下一条 DOMAIN-SUFFIX。www.example.com:第一行不匹配,第二行匹配,执行 PROXY。- 其他未被前两行覆盖的请求:继续到 FINAL,执行 DIRECT。
如果把第二行移到第一行之前,api.example.com 就会先被 DOMAIN-SUFFIX 捕获,后面的 DIRECT 例外没有机会执行。相同道理,写在范围规则后面的 REJECT 也不会自动获得更高优先级。
DOMAIN-SUFFIX,example.com,PROXY 不是对 URL 的任意文字搜索;它不会因为地址路径中出现 example.com 就匹配。规则参数应写域名,不写 https://、页面路径或查询参数。希望只处理一个主机名时,优先用 DOMAIN 描述这个例外。
FINAL 写法:为未命中的请求明确去向
FINAL 是不再附带域名或 IP 条件的最终兜底规则。常见写法是 FINAL,DIRECT 或 FINAL,PROXY。它不是“只匹配无法识别的网站”,而是接住所有到达这一行、尚未被前面规则处理的请求。
因此,FINAL 应放在 [Rule] 列表最后,而不是整份配置文件的最后。配置文件还可能包含其他区段;不要为了移动 FINAL 而把它挪到别的区段。若 FINAL 提前出现,后面的普通规则就失去匹配机会。
| 写法 | 未命中时的结果 | 需要核对 |
|---|---|---|
FINAL,DIRECT | 其余请求直连。 | 需要代理的域名是否已被前面的规则覆盖。 |
FINAL,PROXY | 其余请求交给 PROXY。 | 本地网络和需要直连的目标是否有明确例外。 |
FINAL,REJECT | 其余请求被拒绝。 | 是否有意采用严格允许列表,且能承受遗漏导致的访问失败。 |
下面是一段独立的最小结构示例,用于说明域名规则、IP 规则和兜底的位置。它不是完整的日常配置:其中只列出一个私有地址范围,没有覆盖全部本地网络情形。请在现有配置的副本中合并需要的行,不要再添加第二个 [Rule] 区段。
[Rule]
DOMAIN,api.example.com,DIRECT
DOMAIN-SUFFIX,example.com,PROXY
IP-CIDR,192.168.0.0/16,DIRECT,no-resolve
GEOIP,CN,DIRECT
FINAL,PROXY
IP-CIDR 检查地址范围;GEOIP 根据 IP 地理数据库归类,不能据此判断内容所属地区或运营主体。示例中的 no-resolve 表示不要仅为这一条 IP 规则主动解析域名,它并不表示整份配置都不进行 DNS 查询。IP 规则能否匹配,还取决于该次请求可用的目标地址信息。
PROXY、DIRECT、REJECT:匹配条件与处理动作分开看
规则行前半部分回答“匹配什么”,最后的策略回答“命中后怎么办”。同一条 DOMAIN-SUFFIX 可以配不同策略;策略本身不会改变匹配范围,也不会提高这条规则的排列优先级。
- PROXY
- 把请求交给代理路径。实际使用的连接还取决于当前选择及配置中的策略安排;命中 PROXY 不代表服务端连接、认证或目标访问一定成功。
- DIRECT
- 由本地网络直连目标。适合已确认需要直连的域名或地址范围;DIRECT 不会自动修复 DNS 错误、本地网络阻断或目标服务故障。
- REJECT
- 拒绝匹配的请求。适合明确需要阻止的独立域名或地址;应先确认匹配范围,避免把登录、验证或页面资源一并阻止。
例如 DOMAIN,metrics.example.com,REJECT 只表达对这个示例主机名的处理。若正常内容与待阻止的请求共用同一域名,DOMAIN 或 DOMAIN-SUFFIX 无法按网页路径把二者分开。把整个域名设为 REJECT,可能同时导致图片缺失、按钮失效或页面加载中断。
- 需要例外直连:将具体 DOMAIN 的 DIRECT 行放到更宽的 PROXY 范围之前。
- 需要阻止独立域名:先核对请求记录中的真实主机名,再添加 REJECT,不凭页面上的文字猜测域名。
- 需要按 IP 分类:确认目标地址、掩码与数据库归类,不把 GEOIP 当作域名所属地区的保证。
规则决定去向,协议决定代理连接如何建立。把 PROXY 对应的连接从一种协议换成另一种协议,不会改变 DOMAIN-SUFFIX 的匹配范围。排查顺序应当是先确认“走对路径”,再检查该路径能否正常完成连接。
修改与验证:保存副本,逐条确认命中
下面的操作以已有可用连接、已有配置为前提。订阅与配置文件是不同对象:更新 Home 中的订阅,不等于自动把当前 Config 的规则调整成你想要的顺序。修改前先确认正在编辑的是实际选用的文件,并保留可恢复的副本。
-
保存副本
在 Config 中确认当前选用的文件,先保留原文件副本或导出备份。若文件来自远程更新,使用单独的本地副本承载修改,避免后续更新覆盖。
-
固定姿态
进入
Home → Global Routing → Config,保持当前所选连接不变。不要在同一次验证里同时切换路由姿态、连接和规则文件。 -
编辑规则
进入
Config → 当前文件右侧 ⓘ → Edit Plain Text,找到[Rule]区段。把具体例外放在范围规则之前,确认 FINAL 只在列表末尾保留一次,然后保存。 -
重建请求
确认修改后的配置已被选用,重新建立连接,再重新打开实际测试页面。长连接可能继续使用原有会话,不要仅刷新一个仍复用旧连接的页面就下结论。
-
核对记录
查看本次请求的连接记录,核对目标域名或 IP、命中的规则及处理策略。若路径错误就调整顺序;若路径正确但访问失败,再检查连接本身与目标服务。
测试至少覆盖三个对象:一个应命中具体例外的域名、一个应命中范围规则的域名,以及一个应落入 FINAL 的目标。使用你实际有权访问、且知道预期路径的目标;本文中的 example.com 系列名称只用于解释语法,不作为连通性测试结果。
验收:同时核对域名、规则与策略
网页能打开只能证明一次访问完成,不能证明命中了预期规则。记录“实际目标 → 命中规则 → 处理策略”三项,三者一致后再扩大修改范围。
常见问题:规则不生效时先查哪些位置
已经加了 DIRECT,为什么还是走 PROXY?
先检查 Home → Global Routing 是否为 Config,再检查 Config 中实际选用的文件。随后查看 DIRECT 前面是否存在覆盖同一域名的 DOMAIN-SUFFIX、其他范围规则或提前出现的 FINAL。把具体例外移到首次覆盖它的范围规则之前,再建立新的请求验证。
FINAL 放在最上面,会先试完下面的规则吗?
不会。请求走到 FINAL 时就会取得兜底策略,不会先向下搜索再返回。进入配置的 [Rule] 区段,把 FINAL 移到规则列表末尾,并删除重复的 FINAL;保存后重新核对当前文件是否已选用。
命中 PROXY 了,为什么页面依然打不开?
命中记录只说明路由决策已经完成。保持规则不变,检查 Home 中所选连接是否可用,再用同一个目标做对照。若连接、认证或目标服务失败,应处理对应问题;不断追加相同的 DOMAIN 规则不会修复这些故障。
更新后规则恢复原样,应该怎么保存?
检查更新的是 Home 中的订阅,还是 Config 中的远程配置文件。若远程配置更新覆盖了本地编辑内容,恢复备份,把自定义规则合并到独立的本地副本并选用该文件。后续更新时先比较差异,再手动合并,不直接覆盖唯一可用副本。
如果记录里的目标与预期域名不同,先核对页面跳转、资源域名和本次连接实际使用的地址。一个页面通常会建立多条请求;为入口域名添加 DIRECT,并不代表页面引用的全部资源都会命中同一条规则。按记录逐项确认,比反复扩大 DOMAIN-SUFFIX 范围更容易控制影响。
- 保存前:核对规则语法、区段归属、例外位置与 FINAL 的唯一性。
- 测试前:确认选用文件、Config 姿态及所选连接,避免同时改变多个条件。
- 验收后:保留可工作的副本,再继续增加规则;出现异常时恢复上一份已验证配置。