Shadowrocket(小火箭)可以在 Global Routing 选择 Config 后,按当前配置的 Rule 段落分流。本文面向已经有自己的服务商与可用配置、只想让指定网站走代理的用户:先建立域名匹配规则,再以 FINAL,DIRECT 收尾,最后用请求记录核对实际命中。示例域名仅用于说明语法,不代表线路或服务推荐。
先确认 Config 与代理出口
规则分流需要同时满足两个条件:当前使用的配置中包含目标规则,Home 的 Global Routing 采用 Config。只在 Config 中编辑文件,并不等于所有流量已经按该文件分流;还要确认它是当前选中的配置。
Global Routing 中的 Proxy 是整体采用代理的姿态,Direct 是整体直连;这两者不用于验证本文的“指定网站代理、其余直连”方案。Scene 用于场景选择,也不能简单视为当前文件的 Config 模式。排查时先明确选中 Config,避免场景切换改变测试条件。
PROXY 表示代理策略,通常使用当前选中的代理出口;DIRECT 表示直接连接目标。若现有文件使用自定义策略组,先核对组名与组内选择,不要把组名、服务器显示名称和内置策略混为一谈。本文只使用 PROXY、DIRECT,避免引入额外的组定义。
- 在 Home 选择已有的可用代理出口,并用 Connectivity Test 检查基本连通性。
- 进入 Config,先备份当前配置,再编辑用于本次测试的本地副本。
- 确认修改后的副本处于选中状态,回到 Home → Global Routing → Config。
- 开启连接后重新访问目标网站;已有连接可能继续使用先前的出口,不能作为新规则的验证依据。
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。
| 规则关键字 | 匹配输入示例 | 适用边界 |
|---|---|---|
| DOMAIN | login.example.com | 精确匹配该域名,不自动覆盖其他子域名。 |
| DOMAIN-SUFFIX | example.com | 匹配该域名及其子域名,适合按站点分流。 |
| DOMAIN-KEYWORD | media | 匹配域名中的字符串,可能覆盖原本不打算代理的域名。 |
| FINAL | 无需域名参数 | 承接此前没有命中的请求,应位于 Rule 段落末尾。 |
规则顺序:首条命中决定策略
Rule 段落按从上到下的顺序匹配。请求命中一条有效规则后,就采用该条规则的策略,而不是继续向下寻找“更精确”的规则。将精确例外放在宽泛范围之前,将 FINAL 放在末尾,是编排规则时最重要的约束。
以上一节为例,如果把 DOMAIN-SUFFIX,example.com,PROXY 放到 DOMAIN,login.example.com,DIRECT 前面,login.example.com 就会先命中 PROXY,后面的 DIRECT 例外不会生效。类似地,FINAL 提前出现,会使后面的规则失去预期作用。
- 先排精确例外:例如登录域名必须直连时,用 DOMAIN 放在对应的 DOMAIN-SUFFIX 前面。
- 再排站点范围:用 DOMAIN-SUFFIX 收拢需要代理的主域名与子域名。
- 谨慎加入关键词:DOMAIN-KEYWORD 范围较宽,添加后应测试一个不应命中的对照域名。
- 最后设置兜底:目标是其余直连时,使用 FINAL,DIRECT,并检查此前是否还有覆盖面很大的规则。
现有配置如果包含 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 时直连;它不能代替“某个域名必须代理”的明确要求。
- 若应用直接访问 IP,且请求中没有可用域名信息,域名规则可能无法命中。
- 若一个站点使用多个内容分发域名,只写主域名可能不足以覆盖全部资源。
- HTTPS 的常见目标端口是 443,但本文的域名规则不是按 443 端口匹配,也不只对浏览器有效。
- DNS 解析路径与连接出口需要分别检查;命中 PROXY 并不等于所有解析请求都采用了同一条路径。
保存后按请求记录验证
Connectivity Test 有结果,只能说明相应测试条件下出口具备一定连通性,不能证明某个网站已经命中指定规则。应使用“目标网站、普通网站、例外域名”三类请求做对照,再在请求记录中核对目标、命中规则与策略。
- 保存配置,确认 Config 当前选中的是刚刚修改的文件。
- 确认 Home → Global Routing 仍为 Config;如果曾设置 Settings → On Demand,也检查自动触发是否改变了连接状态。
- 关闭目标页面的旧连接,必要时重新连接 Shadowrocket,再打开新的页面请求。
- 查看对应请求记录:目标域名应命中 DOMAIN-SUFFIX 或其他明确规则,策略应为 PROXY;未列入范围的域名应落到 FINAL 并使用 DIRECT。
- 发现资源失败时记录实际资源域名,不要只根据浏览器地址栏里的主域名判断。
下面是可能在网络错误或日志中见到的通用错误文本;具体显示形式随请求来源与系统而异。这些错误说明连接失败,不单独证明规则语法有误。先看命中策略,再判断是代理出口、直连路径还是目标服务的问题。
报错: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 处理。以后每增加一个域名,都同时验证一个应代理请求和一个应直连请求,比单纯观察连接开关更能确认配置结果。