Shadowrocket 配置规则怎么写:Config、规则顺序与生效排查
简答:Shadowrocket 规则写在当前配置文件的 [Rule] 区域,基本格式是“规则类型,匹配条件,策略”。写完后要在 Home → Global Routing 中选择 Config,并确认当前启用的配置文件;如果规则不生效,优先检查 Config、规则顺序和策略,再检查 DNS 与连接。最常见的错误是把例外规则放在宽泛规则后面。
定义:Shadowrocket 配置规则是一组按照先后顺序匹配域名、IP 或请求特征,并将请求交给 DIRECT、PROXY、REJECT 或自定义策略的文本规则。
先看最小模板:规则写在哪里、怎么让它生效
写了规则却不生效,多半不是语法本身,而是没有选 Config,或者把精确例外放在了 DOMAIN-SUFFIX 等宽泛规则后面。本文为第三方使用指南,Shadowrocket 的实际菜单、规则类型和按钮名称可能随当前 App 版本变化;遇到界面不一致时,以设备中显示的选项和 App 内置说明为准。
| 目标 | 规则示例 | 注意事项 |
|---|---|---|
| 单个主机直连 | DOMAIN,login.example.com,DIRECT | 只匹配这个精确域名 |
| 整个域名范围走代理 | DOMAIN-SUFFIX,example.com,PROXY | 覆盖根域名及其子域名 |
| 未命中请求兜底 | FINAL,DIRECT | 应放在规则末尾 |
可先用下面的语法示例测试顺序:
[Rule]
DOMAIN,login.example.com,DIRECT
DOMAIN-SUFFIX,example.com,PROXY
IP-CIDR,192.0.2.0/24,DIRECT,no-resolve
FINAL,DIRECT
这不是完整配置文件,也不包含任何服务器信息。规则通常由“类型、匹配条件、策略”组成,字段之间使用英文半角逗号。相关规则说明可参考 Shadowrocket 规则与 Global Routing 说明、Shadowrocket 中文规则参考;这些页面属于公开第三方资料,不能替代 App 内置说明。
从零编辑配置:图形添加与纯文本编辑怎么选
- 先确认已有配置:打开 Shadowrocket 底部或首页的
Config,在配置列表中点选准备使用的文件。文件出现在列表中,不代表它已经启用。 - 先做备份:在修改前使用当前版本提供的复制、导出或分享配置功能保存副本。若界面没有完全相同的按钮,保留原文件内容即可,避免直接覆盖唯一配置。
- 选择编辑方式:如果当前版本提供规则编辑器或
Add Rule,可在配置文件的 Rule 区域逐条添加;如果提供纯文本编辑入口,则打开文件内容,查找[Rule]后逐行修改。公开资料显示,规则既可以在规则编辑器查看,也可以直接位于配置文件的[Rule]区域。 - 使用图形界面添加:进入
Config→ 选择目标文件 → 打开规则编辑或Add Rule→ 选择规则类型、填写匹配值和策略 → 保存。新增规则通常会出现在当前列表位置,保存后仍要检查它是否位于宽规则之前。 - 使用纯文本编辑:在
[Rule]下让每条规则单独占一行,例如DOMAIN,login.example.com,DIRECT。不要把普通分流规则放进[General]或[Host]。 - 启用并测试:回到
Home→Global Routing→ 选择Config。再次确认 Config 页面中选中的文件就是刚才修改的文件,然后重新发起同一个网页或应用请求。
服务器列表、订阅内容和配置文件是不同对象:导入订阅只负责增加或更新服务器条目,不会自动把某个配置文件设为当前规则文件。配置文件、规则区域和 Global Routing 的关系,可对照 Shadowrocket 使用说明与配置排查。
规则类型对比:DOMAIN、IP、USER-AGENT 和最终兜底
| 类型 | 匹配对象 | 适合场景 | 限制或风险 |
|---|---|---|---|
DOMAIN | 一个精确域名 | 只处理某个主机,例如登录接口 | 不会自动覆盖其他子域名 |
DOMAIN-SUFFIX | 根域名及其子域名 | 统一处理一个域名范围 | 范围较宽,例外必须放在前面 |
DOMAIN-KEYWORD | 域名中包含指定字符串 | 确实存在稳定关键词特征时使用 | 容易误匹配无关域名 |
IP-CIDR | IPv4 地址段 | 已知目标网段或局域网地址 | 不等于 IPv6,可能受 DNS 解析影响 |
IP-CIDR6 | IPv6 地址段 | 需要处理 IPv6 目标时使用 | 不能用 IPv4 网段代替 |
GEOIP | 目标 IP 的地理库归类 | 做较宽泛的地区策略 | 不是按域名注册地、语言或设备位置判断 |
USER-AGENT | 请求中的 User-Agent | 请求明确带有可识别 UA 时分流 | 并非所有 App 或请求都会携带可用 UA |
FINAL | 前面规则都未命中的请求 | 设置默认直连、代理或拒绝策略 | 放在中间会遮挡后续规则 |
常用策略包括 DIRECT、PROXY 和 REJECT。它们是处理动作,不是服务器协议名称。若写自定义策略组,名称必须与当前配置中已经定义的策略完全一致;拼写不一致会导致规则引用失败,这与规则是否命中是两回事。
iOS 常规规则不是按桌面端进程名直接分应用。实际分流通常依赖域名、IP、GEOIP、USER-AGENT、RULE-SET 或 DOMAIN-SET。USER-AGENT 只能在请求确实带有可识别 UA 时发挥作用,例如 USER-AGENT,curl*,DIRECT;它不能保证覆盖某个 App 的全部网络请求。关于匹配范围和请求特征,可参考 Shadowrocket 规则类型与策略说明。
手写规则、RULE-SET、DOMAIN-SET 和 App 分流怎么选
| 方式 | 什么时候使用 | 优点 | 需要检查什么 |
|---|---|---|---|
| 手写单条规则 | 只处理少量固定域名、网段或例外 | 容易理解、便于逐条回滚 | 类型、顺序、策略名称和半角标点 |
RULE-SET | 需要引用包含完整规则类型的外部规则列表 | 适合维护较多域名、IP 或 GEOIP 规则 | 列表地址是否可访问、内容格式是否被当前版本支持 |
DOMAIN-SET | 外部列表只提供域名,策略由当前规则行指定 | 适合集中维护域名清单 | 列表是否确实是域名列表,而不是带规则类型的列表 |
| USER-AGENT | 请求带有稳定且可观察的 User-Agent | 可按请求特征处理部分流量 | 不能当作通用的按 App 分流方案 |
| App 分流 | 当前版本明确提供对应入口时 | 由 App 界面管理,减少手写规则 | 以当前 App 的实际选项为准,不要把进程名直接填入 DOMAIN |
社区配置参考中将 RULE-SET 描述为包含规则类型的外部规则列表,将 DOMAIN-SET 描述为不带规则类型前缀的外部域名列表;写法示例分别为 RULE-SET,https://example.com/list.list,PROXY 与 DOMAIN-SET,https://example.com/domains.list,PROXY。这些地址仅用于说明格式,不能直接当作可用规则源。
外部规则集与本地规则仍然要遵守当前配置中的先后顺序。若前面已经有更宽的 DOMAIN-KEYWORD、DOMAIN-SUFFIX 或 FINAL,后面的规则集可能没有机会命中。因此建议先用一两条手写规则验证逻辑,再引入规则集;规则集地址、返回内容和当前 App 的支持情况都应自行核对。
常见错误写法速查:写错在哪里、怎么改
| 错误写法 | 问题 | 改成 |
|---|---|---|
DOMAIN,https://docs.example.com/path,PROXY | 把协议和路径粘进了域名条件 | DOMAIN,docs.example.com,PROXY |
DOMAIN-SUFFIX,example.com,PROXY | 使用中文逗号 | DOMAIN-SUFFIX,example.com,PROXY |
DOMAIN,docs.example.com:443,PROXY | 把端口当成域名的一部分 | 域名规则只填写主机名;端口需使用对应端口规则 |
DOMAIN-SUFFIX,example.com,PROXY | 宽规则先命中,例外无法生效 | DOMAIN,login.example.com,DIRECT |
FINAL,DIRECT | FINAL 提前结束后续匹配 | 把 FINAL 移到所有规则末尾 |
DOMAIN-SUFFIX,example.com,proxy | 策略名称大小写或拼写与配置不一致 | 使用当前配置中真实存在的策略名称 |
域名规则的匹配值应是主机名,不要包含 https://、端口、路径、查询参数或完整网页地址。每条规则单独换行,逗号使用英文半角;如果复制后仍不确定,可先只保留一条 DOMAIN 和一条 FINAL 进行测试。
规则不生效:按检查、判断、处理、回滚排查
现象一:写了规则,但请求完全不按分流走
- 检查:打开
Home → Global Routing,查看是否为Config;再打开Config,确认当前选中的文件就是修改后的文件。 - 判断:如果处于
Proxy或Direct,当前请求不会按照这份规则文件进行常规分流;如果文件只是出现在列表中,也不代表它已启用。 - 处理:选择正确文件,切换到
Config,保存后重新打开同一个目标请求。 - 回滚:如果切换后出现新的连接问题,恢复原配置和原 Global Routing 模式,再逐项测试。
现象二:精确例外始终不生效
- 检查:看它前面是否存在
DOMAIN-SUFFIX、DOMAIN-KEYWORD、GEOIP或更早的规则集。 - 判断:规则通常从上到下检查,第一条命中后,后面的规则不会自动重新接管。
- 处理:把精确 DOMAIN 规则移到宽泛规则之前,并检查域名是否只写主机名。
- 回滚:只移动一条规则,记录原位置;确认后再整理完整规则顺序。
现象三:日志显示有请求,但不知道命中了哪条规则
- 检查:打开当前版本提供的
Data、请求记录或Diagnostics,查看请求目标、匹配规则或策略字段;不同版本的字段名称可能不同。 - 判断:如果记录只显示目标地址和连接结果,没有显示匹配规则,不要把它当成规则命中证据。可以用一条明显的临时规则,将目标交给与原策略不同的动作,再比较同一请求。
- 处理:先确认请求目标是哪个主机,再对照规则顺序;随后分别用
DIRECT与PROXY做对比,不要同时更改 DNS、节点和规则。 - 回滚:删除临时规则,恢复原策略,并保留原配置副本。
现象四:Connectivity Test 成功,但网页仍打不开
- 检查:
Connectivity Test位于 Home,用于按照当前Test Method执行连接测试;它测试的是选定测试目标和方法,不等于所有网页、DNS 查询或登录请求都成功。 - 判断:测试成功只能说明该测试路径有结果,不能证明目标网站的规则、DNS、认证和页面资源全部正常。
- 处理:按“连接开关与服务器 → DNS → 当前配置 → 规则命中 → 实际目标请求”的顺序检查,并保持网络和目标一致。
- 回滚:恢复原服务器、原 DNS 和原配置,只留下一个最小规则进行复测。
关于 Connectivity Test 与实际目标访问的区别,可参考 Shadowrocket 测试方法与 Diagnostics 说明。如果已确认规则命中、策略也存在,但目标仍失败,再单独检查节点连接、DNS 解析和目标服务,不要继续盲目调整规则顺序。
发布前自查清单
- 是否编辑了当前真正启用的配置文件?
Home → Global Routing是否选择了Config?- 规则是否位于
[Rule]区域? - 每条规则是否单独换行,并使用英文半角逗号?
- DOMAIN 条件是否只填写主机名,没有协议、路径和端口?
- 精确例外是否放在 DOMAIN-SUFFIX、DOMAIN-KEYWORD 或规则集之前?
- FINAL 是否位于规则末尾?
- PROXY 或自定义策略是否在当前配置中真实存在?
- 需要按 App 判断时,是否确认了当前版本确实提供对应入口?
- 使用 RULE-SET 或 DOMAIN-SET 时,是否核对了外部列表的格式和可访问性?
- 是否只修改一个变量,并用同一网络、同一目标重新测试?
- 是否保留原配置,以便失败时回滚?
完成自查后,仍应把问题拆成三层:规则是否命中、策略是否可用、目标请求是否成功。不要把 VPN 图标、Connectivity Test 成功和网页一定能打开当成同一个结论。
常见问题
Shadowrocket 的规则应该写在什么位置?
普通分流规则应写在当前配置文件的 [Rule] 区域。编辑后还要确认该文件已被选中,并在 Home → Global Routing 中选择 Config;仅仅把文件放进 Config 列表并不代表它正在生效。
DOMAIN 和 DOMAIN-SUFFIX 有什么区别?
DOMAIN 用于精确匹配一个主机名,例如 login.example.com;DOMAIN-SUFFIX 用于匹配根域名及其子域名,例如 example.com 和 www.example.com。需要设置例外时,应把 DOMAIN 放在 DOMAIN-SUFFIX 前面。
为什么写了 FINAL 后,后面的规则没有效果?
规则通常按从上到下的顺序匹配,第一条命中后就采用对应策略。FINAL 会接管前面没有命中的请求,如果放在中间,后面的规则通常没有机会执行,因此应将 FINAL 放在规则末尾。
规则里的域名可以写 https://、端口或路径吗?
不应这样写。DOMAIN 和 DOMAIN-SUFFIX 的匹配值应填写主机名,例如 docs.example.com,不要包含 https://、:443、/path、查询参数或完整网页地址。
RULE-SET 和 DOMAIN-SET 应该怎么选?
如果外部列表本身包含 DOMAIN、IP-CIDR 等规则类型,考虑 RULE-SET;如果列表只提供域名,通常考虑 DOMAIN-SET,并在当前规则行指定策略。两者都要核对列表地址、返回格式和当前 App 版本的支持情况。
Shadowrocket 能不能像桌面客户端一样按进程名分流?
iOS 常规规则主要依赖域名、IP、GEOIP、USER-AGENT、RULE-SET 或 DOMAIN-SET,并不能简单把进程名填入 DOMAIN 规则。当前版本是否提供特定 App 分流入口,应以设备中的实际界面为准;USER-AGENT 也只对能观察到稳定请求标识的流量有效。
Connectivity Test 成功,为什么网页还是打不开?
Connectivity Test 只按当前 Test Method 检查指定测试目标,不等于所有网页、DNS 查询、登录请求和页面资源都成功。应继续检查当前 Global Routing、启用的配置、目标规则、DNS、策略和实际网页请求。
相关阅读
参考资料
- GitHub:Shadowrocket 使用手册资料
- Shadowrocket 中文规则参考:匹配顺序、域名与地址规则(shadowrocketzh.com)
- Shadowrocket Rule Syntax:DOMAIN、DOMAIN-SUFFIX、GEOIP 与 FINAL(dark-rocket.com)
- Shadowrocket 使用说明:配置文件、规则分流与诊断(shadow-help.com)
- Shadowrocket Rules & Configuration Reference:配置结构与排错(rocket-setup.com)
- Shadowrocket Features and Settings:Global Routing、规则与策略(shadow-official.com)
- Shadowrocket Features & Settings:Connectivity Test、DNS 与 Diagnostics(shadowrocketofficial.com)
- GitHub:Shadowrocket 配置规则类型与 RULE-SET、DOMAIN-SET 示例
- shadow-help.com(shadow-help.com)