.conf 是配置文本,不是服务器订阅的另一种名称。本文适合已经拥有自己的订阅、准备阅读或修改 Config 的用户;操作路径以 iPhone / iPad 界面为例,Mac、Windows、安卓、Linux 用户可按所在版本核对相应设置入口。读完可区分全局参数、分流规则、本地映射和请求改写,并按备份、单项修改、重新连接、核对记录的顺序验证。
1. 先分清 Config、服务器与 Global Routing
Shadowrocket(小火箭)的 Home 用于查看和选择已有服务器,Config 用于管理配置文件。服务器条目保存连接所需的地址、端口、协议与认证信息;本文的四个段落则描述解析、分流和改写行为。只导入包含这四段的 .conf,不会凭空产生可用服务器,也不会替代用户已有的订阅。
编辑之前先看 Home → Global Routing。Proxy、Direct、Config、Scene 不是四种服务器协议,而是不同的路由姿态。要验证本文的 [Rule],先使用 Config;处于 Proxy 或 Direct 时,不能拿全局连接的结果证明某条规则已经命中。
| 姿态 | 检查重点 | 与本文的关系 |
|---|---|---|
| Proxy | 全局代理路由 | 不能据此判断 [Rule] 的分流结果。 |
| Direct | 全局直连路由 | 服务器可用与否不是此姿态下的直接验证目标。 |
| Config | 当前启用的配置文件 | 用于验证本文的规则顺序与策略。 |
| Scene | 场景条件及其关联设置 | 先核对场景实际采用的路由与配置,不把它等同于固定的 Config。 |
这条流程表示编辑与验证顺序,不是网络处理管线。实际连接中的 DNS 解析、域名匹配与 IP 匹配可能互相影响;[URL Rewrite] 也不是所有流量都必经的一站。Settings → On Demand 管理按条件连接的行为,同样不能替代 Config 中的分流规则。
2. .conf 的分段语法与安全编辑顺序
段名独占一行,并用英文方括号括起。参数通常使用英文等号,规则字段通常使用英文逗号;不要把中文输入法的逗号、括号混入语法。下面是结构示例,省略未使用的段不等于配置损坏。它仅演示文本布局,不包含服务器凭据。
[General]
dns-server = system
[Rule]
DOMAIN-SUFFIX,example.com,PROXY
FINAL,DIRECT
[Host]
lab.example.com = 192.0.2.10
[URL Rewrite]
^http://example\.com/(.*)$ https://example.com/$1 302
- 进入 Config,保留当前可工作的文件副本;若文件来自远程配置,同时记录原地址和本地修改内容。
- 打开待修改文件的编辑入口,确认当前编辑对象与准备启用的文件一致。不同平台的编辑按钮位置可能不同。
- 每次只改一类内容,例如只调整一条 DOMAIN-SUFFIX,不同时更换 DNS、增加映射和改写规则。
- 保存后确认该文件已启用,回到 Home 检查 Global Routing 为 Config,再重新建立连接并发起新的测试请求。
注释宜单独占一行,例如以 # 开头说明规则用途。不要把说明文字直接接到参数值后面,除非已经确认该位置支持行尾注释。文件扩展名也应保持为 .conf,避免文本编辑器额外追加 .txt。
3. [General]:全局参数与 DNS 解析
[General] 放置适用于配置的全局参数。下面的 dns-server = system 表示使用系统 DNS 设置,不是设置一个名为 system 的服务器。它不保证当前网络的解析结果一定可用;若连接失败,需要分清是解析失败、路由错误,还是目标服务没有响应。
[General]
dns-server = system
不要看到他人的参数列表就整段复制。IPv6、DNS 与绕过设置会改变不同层面的行为;例如修改 DNS 不能修正错误的服务器认证信息,关闭某类地址解析也不能解释所有超时。先保留现有可工作的参数,再围绕明确现象调整一项。
[General] 检查项
- 段名
- [General]
- 参数
- dns-server = system
- 验证对象
- 新请求的域名解析结果与错误记录
先确认解析是否成功,再判断连接走向。
[Rule] 检查项
- 段名
- [Rule]
- 匹配项
- DOMAIN-SUFFIX,example.com,PROXY
- 兜底项
- FINAL,DIRECT
规则决定策略,不负责提供服务器认证信息。
检查时应发起新连接。已经建立的长连接可能继续使用原来的连接状态,浏览器和系统也可能保留 DNS 缓存。只刷新一次页面,既不能证明新的 DNS 设置生效,也不能据此断言保存失败。
4. [Rule]:从上到下匹配,FINAL 放在最后
[Rule] 按顺序匹配,前面的规则命中后,后面的规则通常不再参与该连接的策略选择。因此更具体的例外应放在宽泛规则前面。下面先让一个精确域名直连,再让同一域名后缀下的其他请求使用 PROXY。
[Rule]
DOMAIN,status.example.com,DIRECT
DOMAIN-SUFFIX,example.com,PROXY
IP-CIDR,192.168.50.0/24,DIRECT,no-resolve
GEOIP,CN,DIRECT
FINAL,PROXY
DOMAIN精确匹配域名;示例中的 status.example.com 会先命中 DIRECT。DOMAIN-SUFFIX匹配 example.com 及其子域名,不需要写成*.example.com,也不应填入完整网页地址。IP-CIDR匹配目标 IP 所属网段;192.168.50.0/24表示该私有网段,不表示所有局域网。no-resolve用于避免为了这条 IP 规则主动触发域名解析;它不是整个配置的“关闭 DNS”开关。GEOIP,CN,DIRECT根据目标 IP 的地理数据库归属判断,不是根据网页语言或域名后缀判断。FINAL,PROXY处理前面都未匹配的连接。若把它放到开头,后面的普通规则便失去匹配机会。
PROXY 与 DIRECT 是策略关键字,不是协议名。Shadowsocks、VMess、VLESS、Trojan、Hysteria2、WireGuard 描述的是服务器连接方式,不能随意填入规则末尾充当策略。若使用自定义策略名称,必须确认它确实在配置中有对应定义,拼写也完全一致。
结论:先验证一个精确域名,再扩大范围
在副本中为自己管理的测试域名添加一条 DOMAIN 规则,放在 FINAL 前,重新连接后核对新请求的匹配记录;确认结果正确,再改成 DOMAIN-SUFFIX。这样能把“语法不对”与“范围过宽”分开排查。
5. [Host]:域名映射不等于路由策略
[Host] 用于配置本地域名映射。左侧写域名,右侧写要使用的地址;不要把浏览器地址栏里的协议、端口和路径一起粘进去。映射改变的是目标地址解析,不会自动把该连接变成 DIRECT,也不会替目标站点修复证书。
[Host]
lab.example.com = 192.0.2.10
api.example.com = 192.0.2.20
| 写法或现象 | 问题 | 处理 |
|---|---|---|
https://lab.example.com/path | 把 URL 当成域名键。 | 左侧只保留 lab.example.com。 |
192.0.2.10:443 | 把端口附加到 IP 映射值。 | 映射只填地址;HTTPS 的 443 端口属于连接目标信息。 |
| 映射后出现证书错误 | 该地址上的服务未必持有对应域名的有效证书。 | 核对服务端证书与域名,不通过忽略证书错误来掩盖映射问题。 |
| 仍然经过代理 | 地址映射并未指定 DIRECT。 | 回到 [Rule] 核对该域名或目标地址命中的策略。 |
例如,自己管理的测试域名指向内部服务器后,还需确保当前网络或所选代理能够到达该地址。若该服务只能从本地网络访问,应单独检查对应的直连规则。映射正确、地址可达、端口开放和证书有效是四项独立条件,不能只验证其中一项。
6. [URL Rewrite]:正则匹配与重定向
[URL Rewrite] 面向请求地址,不是服务器订阅更新工具。以下规则只匹配 example.com 的明文 HTTP 地址,将路径保留后返回到 HTTPS 地址的 302 重定向。它改变的是请求地址处理方式,不是在 [Rule] 中选择 PROXY 或 DIRECT。
[URL Rewrite]
^http://example\.com/(.*)$ https://example.com/$1 302
^限定从地址开头匹配,$限定到结尾,减少意外覆盖其他地址的机会。example\.com中的点被转义,表示字面量的点;未转义的点在正则中通常表示任意单个字符。(.*)捕获斜杠后的内容,替换地址中的$1引用这一组内容。302是重定向状态码,不是端口号;不要把它改成服务器使用的 443。
测试地址应是自己控制的服务,例如检查一条带路径和查询参数的 HTTP 请求,观察重定向的 Location 是否保留预期内容。浏览器的 HTTPS 自动升级或 HSTS 可能使请求根本没有以 HTTP 发出,因此“浏览器最终打开 HTTPS”不能单独证明该规则生效。
常见错误包括匹配范围过宽、替换目标再次命中原规则,以及把规则写进 [Rule] 段。若发生反复跳转,先停用新增改写,恢复原始请求,再收窄正则;不要同时增加多条重定向去补救同一个循环。
7. 保存后不生效:按文件、姿态、匹配条件排查
排查要先确认“正在使用哪份文件”,再确认“请求是否进入所测条件”。服务器订阅更新与远程配置更新不是同一件事:前者主要影响已有服务器条目,后者可能替换配置文本。对远程配置做过本地修改时,更新前应保留副本,避免把覆盖后的结果误认为编辑器没有保存。
保存了规则,为什么所有网站还是走同一种策略?
先到 Config 确认刚保存的文件已启用,再到 Home → Global Routing 选择 Config。随后检查 FINAL 是否位于末尾,关闭旧的测试连接后发起新请求,并查看实际匹配记录。
加了 [Host],为什么网页仍打不开?
先把映射值与自己服务器的真实地址逐字核对,再检查该网络能否到达目标地址及端口。如果是 HTTPS 的 443 端口,还要核对站点证书;文中的 192.0.2.10 仅供语法演示,不能作为实际服务地址。
订阅更新后,为什么没有出现新规则?
回到 Home 核对服务器列表,再到 Config 查看规则文件。服务器订阅更新不等于配置文件更新;需要修改 [Rule] 时,应编辑正在启用的配置,而不是把规则粘贴进服务器地址字段。
改完配置后,断开连接又自动连上了?
到 Settings → On Demand 核对当前条件。进行手动对照测试时,可先暂停相关自动连接条件,完成验证后恢复原设置;On Demand 控制连接触发,不会替你调整 [Rule] 顺序。
若仍无法定位,恢复备份配置并保持同一服务器、同一网络、同一测试目标不变。备份可用而修改版失败时,再逐项加入差异;两份都失败时,优先检查服务器连接和目标服务,而不是继续扩大规则范围。向他人提供诊断材料前,应移除订阅地址中的令牌、认证信息与其他个人数据。
- 全局参数有疑问:先恢复 [General] 的原始值。
- 走向与预期不符:核对 Global Routing、当前文件、规则顺序与策略名称。
- 单个域名解析异常:检查 [Host]、DNS 缓存和新连接的解析结果。
- 请求反复跳转:停用新增 [URL Rewrite],逐条恢复并测试。