Shadowrocket(小火箭)的规则优先级由排列位置决定,不是由域名长短或策略名称决定。本文适合已经有自己的服务商与订阅、需要调整分流的用户:先核对 Home 中的 Global Routing,再在 Config 检查当前配置,把具体例外放在宽泛规则前,并用新连接验证 FINAL 是否正确兜底。
先确认 Global Routing 使用 Config
编辑规则之前,先区分“是否连接”与“如何分流”。Home 中的连接开关负责启用连接;Global Routing 决定请求采用哪一种处理方式。要验证配置文件中的规则,应先将 Global Routing 设为 Config,再到 Config 确认当前使用的配置文件。只修改了一个未启用的文件,不会改变正在生效的分流结果。
Global Routing 中的 Proxy 表示全局采用代理处理,Direct 表示全局直连;两者都不能用来证明某条配置规则已命中。Scene 用于按场景应用相应设置,也不要把它当成固定的 Config 状态。做单条规则排查时,先明确选择 Config,减少场景切换带来的干扰。
结论:先固定模式,再修改规则
如果调整规则后访问路径没有变化,第一步不是再加一条规则,而是回到 Home 核对 Global Routing,并在 Config 核对实际生效文件。
从上到下匹配,不按“更具体”自动排序
规则段可以理解为一个有顺序的判断列表。请求进入分流过程后,程序按顺序检查规则条件;一旦命中,就采用该条指定的策略,不再继续寻找“看起来更合适”的后续规则。因此,具体例外通常应放在通用规则前,而不是依赖程序自动比较条件的精细程度。
下面的片段展示了一个常见顺序问题。DOMAIN-SUFFIX,example.com,PROXY 会覆盖 example.com 本身以及它的子域名。当请求目标为 api.example.com 时,第一行已经命中,后面的精确域名规则便没有机会参与这次判定。
[Rule]
DOMAIN-SUFFIX,example.com,PROXY
DOMAIN,api.example.com,DIRECT
FINAL,PROXY
如果目的确实是让这个子域名直连、其余同后缀域名使用代理,应把例外提前。这里的域名仅用于解释语法,不是连接服务,也不用于测试可用性。
[Rule]
DOMAIN,api.example.com,DIRECT
DOMAIN-SUFFIX,example.com,PROXY
FINAL,PROXY
同样的规律适用于拦截例外:若只想拒绝某个子域名,而允许同一后缀的其他请求继续使用代理,精确的 REJECT 规则也必须排在宽泛的后缀规则之前。不要把“拒绝策略看起来更强”误当成优先级更高。
DOMAIN-SUFFIX、IP-CIDR 与 GEOIP 怎样排列
这些关键字描述的是不同匹配条件,而不是固定的优先级等级。DOMAIN-SUFFIX 检查域名后缀,IP-CIDR 检查目标 IP 是否位于指定网段,GEOIP 根据 IP 地理归属数据匹配地区代码。实际排序应先表达明确的业务例外,再表达覆盖范围更大的地址或地区规则。
域名条件
- DOMAIN
- api.example.com,DIRECT
- DOMAIN-SUFFIX
- example.com,PROXY
- 匹配依据
- 请求对应的域名信息
精确例外在前,后缀覆盖在后。
地址条件
- IP-CIDR
- 192.168.0.0/16,DIRECT,no-resolve
- GEOIP
- CN,DIRECT
- 匹配依据
- 目标 IP 与本地归属数据
特定网段通常先于宽泛地区规则。
IP 规则需要能用于判断的目标 IP。请求最初只有域名时,解析过程可能影响后续能否命中 IP-CIDR 或 GEOIP。示例里的 no-resolve 表示不要仅为这条规则主动触发域名解析;它不表示关闭整个应用的 DNS,也不表示所有域名请求都能直接命中该网段。
- 域名有明确例外:先放 DOMAIN 或 DOMAIN-SUFFIX,让该请求在到达宽泛 IP 条件前得到确定策略。
- 局域网有明确范围:按实际网络写 IP-CIDR;
192.168.0.0/16是私有地址范围之一,不代表所有本地网络。 - 按地区设置一般策略:把 GEOIP 放在特定例外之后。归属数据库描述的是 IP 归属,不是网站使用的语言,也不是域名后缀。
- 没有任何条件命中:交给规则段末尾的 FINAL,而不是在前面插入无条件规则。
GEOIP 结果依赖应用使用的归属数据,不能保证与网站运营方所在地一致。使用 CDN 的网站还可能在不同时间解析到不同地址。如果一个域名必须保持固定策略,通常应为该域名单独写规则,不宜仅靠 GEOIP 推断它的访问路径。
PROXY、DIRECT、REJECT 是动作,不是优先级
规则通常由关键字、匹配值和策略组成。例如 DOMAIN-SUFFIX,example.com,PROXY 的前两部分回答“匹配谁”,最后一部分回答“命中后怎么办”。FINAL 是特殊的兜底形式,不需要再填写域名或网段,因此写成 FINAL,PROXY。
| 策略 | 命中后的处理 | 排查重点 |
|---|---|---|
PROXY |
通过当前配置对应的代理出口处理 | 检查所选服务器或策略组实际选择,以及服务是否可用 |
DIRECT |
不经过代理服务器,直接连接目标 | 检查当前网络能否直接到达目标 |
REJECT |
拒绝匹配到的请求 | 检查是否误拦截了登录、图片或接口域名 |
命中 PROXY 只说明规则选中了代理处理,不等于目标一定可达。服务器不可用、目标服务异常或解析失败,仍会造成访问失败。命中 DIRECT 也不等于请求绕过所有规则检查,它只是完成规则判定后采用直连动作。
如果配置中使用自定义策略组名称,规则末尾必须与已有名称准确对应。不要把任意说明文字直接写成策略,也不要只看规则写着 PROXY 就认定当前出口正确;还应核对 Home 的选择及配置中相关策略组的实际状态。
FINAL 为什么放最后,以及选 PROXY 还是 DIRECT
FINAL 不再限定某个域名、网段或地区,而是承接到达该位置的剩余请求。把它放在规则段前部,会让后面的规则失去被匹配的机会。因此维护一份配置时,应检查规则段末尾的兜底,而不是遇到问题就反复增加 FINAL。
[Rule]
DOMAIN,api.example.com,DIRECT
DOMAIN,blocked.example.com,REJECT
DOMAIN-SUFFIX,example.com,PROXY
IP-CIDR,192.168.0.0/16,DIRECT,no-resolve
GEOIP,CN,DIRECT
FINAL,PROXY
这是一段用于阅读顺序的规则示例,不是完整配置文件。保留现有配置中的其他必要段落,再依据实际需求合并规则;不要用这几行覆盖整个文件。示例中的第一个子域名使用 DIRECT,第二个被 REJECT,同后缀的其他域名使用 PROXY;其余请求再按地址、地区和最终兜底依次判断。
- 选择 FINAL,PROXY:表示没有命中特定例外的请求也使用代理。适合希望让未分类请求统一走代理出口的配置意图。
- 选择 FINAL,DIRECT:表示只有前面明确指定代理的请求才走代理,其余请求直连。需要接受未列入规则的目标可能直连失败这一结果。
- 更改前先备份:保留当前可用配置,记录原来的 FINAL 策略。发现影响范围扩大时,可以恢复原文件,而不是继续叠加例外。
结论:先写清未分类请求的预期路径
检查 FINAL 时,先回答“没有命中任何已知规则的目标应走哪里”,再选择 PROXY 或 DIRECT;不要把兜底策略当成修复所有连接故障的开关。
修改后怎样验证,避免把缓存当作新结果
规则修改应以“保存、生效、新连接、核对记录”为一个完整过程。浏览器和应用可能复用已经建立的连接,单纯回到页面不一定会重新经历同样的规则判定。测试时应区分旧连接的延续与新请求的结果。
- 备份当前文件:在 Config 确认正在使用的配置,保留修改前的副本,并记录本次只准备调整的目标域名或网段。
- 只改一个变量:例如仅把 DOMAIN 例外移到 DOMAIN-SUFFIX 之前,先不要同时修改 DNS、服务器和 FINAL。
- 保存并确认生效:完成编辑后确认当前配置仍是目标文件,回到 Home 检查 Global Routing 为 Config、连接状态正常。
- 发起新连接:关闭目标页面或相关应用的旧连接后重试;必要时在允许短暂中断的情况下重新连接,再访问目标。
- 核对连接记录:在 Data 中查看可用的连接记录或日志信息,核对目标域名、目标 IP 与策略;记录提供规则信息时,再核对具体命中项。
例如预期 api.example.com 命中 DIRECT,记录却显示它由同后缀规则走 PROXY,应先检查顺序与文件是否生效。若记录已经显示 DIRECT,但访问仍失败,应转查直连可达性,而不是继续把同一条规则往上复制。
用户已有的服务器订阅更新与配置文件更新也要区分。服务器列表发生变化,不一定会改变 Config 中的规则;远程配置更新则可能替换本地编辑内容。修改前确认编辑对象,更新后重新核对规则顺序与 FINAL,才能判断是匹配问题还是内容被更新覆盖。
规则优先级常见问题
规则写得更具体,为什么还是没生效?
Shadowrocket 不会自动把更具体的规则提升到前面。到 Config 查看实际规则顺序,把 DOMAIN 例外放到会覆盖它的 DOMAIN-SUFFIX 前,再保存并建立新连接。还要确认该文件正在使用,且 Global Routing 为 Config。
把 FINAL 改成 PROXY 后,为什么还有请求直连?
FINAL 只处理前面没有命中的请求。先查该目标是否已命中更靠前的 DIRECT 规则,例如 DOMAIN、IP-CIDR 或 GEOIP;已经命中的请求不会再由 FINAL 重新决定策略。
GEOIP,CN,DIRECT 会覆盖前面的域名代理规则吗?
不会。若请求已命中前面的 DOMAIN-SUFFIX 代理规则,匹配就停止。只有仍未命中的请求才会走到 GEOIP。若结果与预期相反,应核对请求实际域名、当前文件以及记录中的命中信息。
加了 REJECT 后页面只加载一半,怎么恢复?
先恢复刚新增的 REJECT 规则,再重新打开页面核对是否恢复。一个页面可能同时请求登录、接口、图片等多个域名;确定误拦截目标后,缩小条件范围,必要时把明确允许的精确例外放在宽泛拒绝规则前。
每次更新配置后,自定义规则都会消失怎么办?
先判断更新的是服务器订阅还是远程配置文件。若远程文件覆盖了本地修改,保留一份可独立维护的配置副本,并在后续更新前对比需要保留的规则;不要仅靠重复粘贴规则解决,还要避免重复条目改变实际顺序。