官方手册 · Config 参考
Shadowrocket 配置大全 规则与匹配顺序
本页是按主题查阅的系统手册,解释配置文件如何组织、请求怎样命中规则,以及策略与 DNS 如何影响结果。首次导入和建立连接请先阅读使用说明;完成快速上手后,再回到本页逐项核对配置。
- General / Rule
- Host / URL Rewrite
- PROXY / DIRECT / REJECT
配置文件结构:先分清数据与规则
Shadowrocket 中的服务器信息与配置文件承担不同任务。服务器信息描述连接到哪里、使用哪种协议以及怎样认证;配置文件描述请求如何处理、哪些目标直接连接、哪些目标交给代理策略。导入订阅后能够看到服务器,并不代表已经选中了预期的规则文件。反过来,保存了一份包含完整规则的文件,也不等于其中引用的代理出口已经具备可用参数。查错时应把这两部分分别确认。
Config 中的文件与实际生效文件
进入 Config 后,先核对当前使用的文件,再查看准备编辑的文件。列表里同时存在多份配置时,文件名称只用于辨认,不能证明其中内容相同。修改前保留一份副本,记录当前 Global Routing 姿态和所选服务器;这样即使修改导致访问异常,也能退回原文件进行对照。远程配置还要确认更新方式,避免本地编辑随后被来源文件覆盖。
配置文件通常使用分节结构,方括号包围节名,节内逐行填写设置或规则。General 集中放置通用选项,Rule 描述请求分流,Host 描述静态主机映射,URL Rewrite 描述符合条件的 URL 处理。各节的职责不同,不能因为都写在同一文件里,就把它们理解为一张从头执行到尾的规则表。尤其不能把 Host 行直接粘贴进 Rule。
[General]
bypass-system = true
dns-server = system
[Rule]
DOMAIN-SUFFIX,example.com,PROXY
IP-CIDR,192.168.0.0/16,DIRECT,no-resolve
FINAL,PROXY
阅读片段时保留上下文
上例是用于查阅的最小片段:General 中两行采用等号赋值,Rule 中各项采用英文逗号分隔。它只展示通用选项、域名规则、私有地址规则与兜底规则的关系,不能代替你的服务器信息。PROXY 表示交给代理策略,最终出口仍依赖当前配置和所选服务器。示例中的 example.com 是保留示例域名,替换时应使用实际需要处理的目标,而不是服务商的服务器地址。
理解一行规则时,先看首字段的规则类型,再看匹配对象,最后看策略与可选参数。例如 IP-CIDR 行比 DOMAIN-SUFFIX 行多了 no-resolve,含义与触发域名解析有关,不是策略名称。FINAL 的结构又不同,它没有匹配对象字段。复制时应保持英文标点和字段顺序,避免输入法把逗号变成中文逗号,或者给节名添上多余字符。
注释应单独成行,说明为什么需要某个例外,而不是仅仅把规则原文复述一遍。对于从他处取得的片段,先判断它属于哪个节、需要哪些前置条件,再决定插入位置。不要默认所有具有类似节名的配置都能直接互用;设置项、可选参数和功能支持应以 Shadowrocket 当前应用内说明为准。遇到无法识别的项目,应缩小到单行验证。
本地维护与订阅更新的边界
Subscribe 主要用于更新服务器项目,Config 文件更新则可能改变规则、DNS 或其他通用行为。两者即使来自同一服务商,也不必然具有相同更新范围。维护前先问清楚正在更新的是哪一类内容,再观察更新后服务器选择与规则文件是否发生变化。把连接异常一概归因于订阅失效,容易遗漏实际是文件切换或本地例外被替换的问题。
保存配置后应回到使用入口核对生效状态,而不是只确认编辑器已经关闭。某些选项对新连接才有意义,旧连接仍可能沿用之前建立的通道。用于比较的测试应关闭旧请求后重新发起;若需要重新建立连接,先保存正在进行的工作。完整操作顺序可参照使用说明,本页后续章节侧重解释每项设置的判断依据。
General 与 DNS:解析不是出口策略
General 中的设置会影响请求进入规则判断前后的基础行为,因此修改范围通常比单条域名规则更大。DNS 负责把域名转换成地址,Rule 决定如何处理请求,服务器参数负责建立代理连接;这三层互相关联,但不能互相替代。域名能够解析,不等于目标服务可以访问;代理服务器能够连接,也不等于所有域名都能取得合适的解析结果。
先建立可以解释的基线
[General]
bypass-system = true
dns-server = system
这里的 dns-server = system 表示使用系统 DNS 来源作为基线。它有利于先观察当前网络下的基本解析行为,但不承诺适用于所有网络。bypass-system 是通用的系统流量绕过设置,不应当被当成“全部私有地址直连”的替代写法。是否需要增加具体地址规则,应结合目标地址、当前网络和请求记录判断,不能只根据设置名称推断覆盖范围。
首次排查时,先保留较少的 General 选项,使每次变化都能解释。若一次同时替换 DNS、添加规则、切换服务器,再发现页面恢复,仍无法知道是哪项修改生效。更稳妥的方法是固定服务器与 Global Routing,只修改一个变量,用相同目标重新发起请求,然后把结果记下来。恢复可用后,再决定是否保留该项变化。
域名规则与地址规则需要的信息不同
DOMAIN、DOMAIN-SUFFIX 和 DOMAIN-KEYWORD 依赖请求中可识别的域名;IP-CIDR 与 GEOIP 依赖地址信息。当请求已经能由前面的域名规则决定策略时,没有必要为了后面的地址规则额外进行匹配。若走到地址类规则,客户端可能需要可用的目标地址。这里的解析过程与最终连接使用的解析路径不应简单等同,特别是代理协议和远端处理方式不同时。
某些请求以地址发起,或者客户端未取得足够域名信息,域名规则便没有可供匹配的对象。此时即使浏览器地址栏显示一个网站名称,也不能据此证明每个底层请求都带有同一个域名。应查看具体连接记录,分别确认域名、目标地址、命中类型和所用策略。一个页面包含多个域名时,也要逐个看失败请求,而不是只测试首页主域名。
DNS 设置变化后的验证范围
切换网络后出现异常,先比较同一域名在当前网络下是否能解析,再比较新请求是否实际进入预期策略。已有缓存会影响测试结果,已有连接则可能完全不重新解析。可以关闭对应页面后重新打开,必要时按应用提供的操作重新建立连接,再观察新记录。不要把一次刷新成功当作持久结论,也不要凭某个地址改变就判定解析发生错误。
对本地网络资源,系统 DNS 有时承担内部名称解析;任意替换来源可能让这些名称失去解析路径。对公共域名,不同网络也可能返回不同的服务地址,这种差异本身不代表故障。应先验证返回地址是否可达、请求是否使用正确协议,以及服务端证书是否与域名对应,再考虑调整 DNS。用直接填写地址的方式访问 HTTPS 网站,通常不能完整模拟正常域名请求。
不要用 Host 映射长期掩盖动态域名的解析问题。映射会把地址固定下来,后续服务迁移时可能继续指向旧地址,并使 DNS 调整看起来没有效果。若同一域名既有 Host 项又有域名规则,应分别记录这两类设置:前者改变地址来源,后者决定策略。删除映射前也要确认是否仍有本地业务依赖它,避免把一次排查扩大成新的访问问题。
涉及隐私与诊断时,只保留必要的目标信息。DNS 记录可能暴露正在访问的域名,分享截图或文本前应移除个人业务名称、账号标识及订阅地址。进一步排查连接失败时,可结合使用说明中的排查步骤核对授权、服务器与网络状态;DNS 应作为明确的一层来检查,而不是所有故障的统一解释。
域名规则:精确、后缀与关键词
域名规则适合表达“这个服务应当使用哪种策略”,通常也比维护不断变化的服务地址更直观。选择类型时,应先明确希望覆盖一个完整主机名、一个域名及其子域名,还是任何包含某段文字的域名。三者的覆盖范围逐步扩大,不能仅因写起来短就选最宽的类型。范围越宽,越需要检查是否会匹配原本不相关的请求。
DOMAIN:完整域名精确匹配
[Rule]
DOMAIN,api.example.com,PROXY
DOMAIN,static.example.com,DIRECT
FINAL,PROXY
DOMAIN 用于匹配完整域名。第一行只表达 api.example.com 的处理方式,不自动包含 example.com,也不自动包含更深一级的子域名。适合用于单个接口或作为大范围规则之前的特定例外。填写时只写主机名,不带 https://、端口、路径或查询参数;这些 URL 组成部分不是 DOMAIN 的匹配字段,混在一起会改变原本想表达的对象。
精确规则便于审查,因为每一项都能对应到一个具体服务。代价是当页面又请求其他域名时,需要另行确认它们的策略。不要看到主域名已命中,就认为登录、图片、验证和接口请求也走相同出口。排查时应从失败的请求记录取得实际主机名,再决定是否补充规则;从网址外观猜测依赖域名,容易漏掉真正失败的位置。
DOMAIN-SUFFIX:域名边界上的覆盖
[Rule]
DOMAIN,api.example.com,PROXY
DOMAIN-SUFFIX,example.com,DIRECT
FINAL,PROXY
DOMAIN-SUFFIX,example.com,DIRECT 用于覆盖 example.com 及其子域名。它按域名后缀关系判断,不等于任意字符串包含,因此不应把另一个仅在名称中含有 example.com 字样的域名视为同一范围。上例先对 api.example.com 指定 PROXY,再让该域下其他请求使用 DIRECT。精确例外在前、概括规则在后,阅读时即可看出例外与默认行为。
写后缀时通常填写 example.com,而不是把浏览器中的完整 URL 原样复制进去,也不要把网页路径当成域名的一部分。通配符式的 *.example.com 不应凭其他语法的习惯直接套入这里。若只需要一个主机名,优先使用 DOMAIN;若确实需要整组子域名,再使用 DOMAIN-SUFFIX。范围应由业务需求决定,而不是由规则数量决定。
DOMAIN-KEYWORD:字符串范围更宽
[Rule]
DOMAIN-KEYWORD,example,PROXY
FINAL,DIRECT
DOMAIN-KEYWORD 检查域名中是否包含指定字符串。它不理解某段文字是不是品牌、组织名称或域名边界,所以 example 可能出现在多个彼此无关的域名中。关键词规则适合明确知道覆盖范围的场景,也可用于临时诊断,但不能替代对目标域名的梳理。短词、常见词或带有业务含义的宽词,尤其容易造成意外命中。
把关键词规则插在精确规则之前,会让后面的精确规则失去处理这些请求的机会。即使精确规则“看起来更具体”,也不会因此自动获得更高优先级。测试时应选取三类目标:确实需要覆盖的域名、不应覆盖但含相同文字的域名、完全无关的域名。只有覆盖与排除都符合预期,才能说明这条规则的边界适合当前配置。
规则对象不是服务器名称
域名规则中的匹配对象是请求目标,不是 Home 中展示的服务器备注。改动服务器名称不会让 DOMAIN-SUFFIX 的匹配对象随之改变;反过来,修改目标域名规则也不会修正服务器认证参数。若同一目标在 Proxy 姿态能访问、在 Config 姿态失败,应首先比较命中策略和出口,而不是立即重填 Add Server。两个层面的改动应分开验证。
审查现有域名规则时,可以按“精确例外、明确后缀、必要关键词”的顺序整理,并为每组记录目的。删除重复项之前先比较策略:同样的域名配上不同策略,并不是可以随意合并的重复。若需要屏蔽目标,策略可改为 REJECT,但匹配范围的判断仍完全相同;具体边界见REJECT 规则与拦截原理。
地址与请求特征:IP-CIDR、GEOIP、USER-AGENT
地址类规则不依赖服务域名是否稳定,而是根据目标地址或地址所属地区进行判断。它们适合私有网络、已知地址段或作为较宽的后续分类,但不能精确表达某个网站的完整服务范围。同一个服务可能同时使用多个地址段,不同服务也可能共享基础设施。把一个观察到的地址当成某个网站的永久标识,会使规则逐渐偏离实际情况。
IP-CIDR 与前缀长度
[Rule]
IP-CIDR,192.168.0.0/16,DIRECT,no-resolve
IP-CIDR,10.0.0.0/8,DIRECT,no-resolve
IP-CIDR,172.16.0.0/12,DIRECT,no-resolve
IP-CIDR6,fc00::/7,DIRECT,no-resolve
FINAL,PROXY
CIDR 写法由网络地址与前缀长度组成。IPv4 的 /32 表示单个地址,较短前缀覆盖更大的地址集合;192.168.0.0/16 不是“只匹配最后两段为零的地址”,而是描述整个前缀范围。上例展示常见私有 IPv4 地址范围和 IPv6 的本地唯一区域地址范围。它们是语法示范,是否需要全部加入,应结合实际访问目标和当前网络决定。
私有地址直连只决定策略,不会建立原本不存在的本地路由,也不会让不同网络中的同名私有地址自动互通。若目标在另一个网络内,仍需要正确的网络可达条件。多个网络都使用相同私有地址时,还可能出现地址含义冲突。因此看到 DIRECT 命中后仍无法连接,应继续核对当前接入网络、目标设备是否在线、端口是否开放,而不是反复扩大 CIDR 范围。
no-resolve 的边界
no-resolve 用于避免仅为匹配该地址规则而触发域名解析。它不表示禁止整个请求使用 DNS,也不是把某个目标强制转换成直接连接。若请求本来就带有可用目标地址,地址规则仍可能匹配;若当前只有域名且缺乏可用地址信息,则不应期待这条规则主动解析后完成判断。调试时必须先说明请求当时具有什么信息。
是否添加 no-resolve,要看希望这条规则承担什么职责。对于明确的私有地址访问,避免为了每个公共域名额外尝试地址匹配通常更容易解释;对于确实需要按解析地址分类的请求,则应理解省略参数可能带来的解析依赖。不要把它机械加到每条规则末尾,DOMAIN 或 FINAL 也不能照搬地址规则的字段结构。
GEOIP 是地址归类,不是站点归属
[Rule]
DOMAIN,api.example.com,PROXY
GEOIP,CN,DIRECT
FINAL,PROXY
GEOIP,CN,DIRECT 根据可用的目标地址及地理归属数据库判断,不根据网站文字、域名后缀或用户所在地判断。一个中文页面的地址未必归入 CN,一个其他语言页面的地址也可能归入 CN。CDN、地址迁移与数据库差异都可能影响结果,因此 GEOIP 更适合作为概括规则,放在必须明确处理的域名例外之后,而不是用来证明网站属于哪个组织。
| 类型 | 判断依据 | 主要边界 |
|---|---|---|
IP-CIDR | IPv4 地址前缀 | 地址段不等于完整网站范围 |
IP-CIDR6 | IPv6 地址前缀 | IPv4 规则不会自动覆盖 IPv6 |
GEOIP | 地址的地理归属 | 受目标地址与数据库信息影响 |
USER-AGENT | 可识别的 User-Agent | 受请求可见性及实际字段影响 |
USER-AGENT 不是通用应用选择器
[Rule]
USER-AGENT,ExampleClient*,DIRECT
FINAL,PROXY
USER-AGENT 依据可识别请求中的 User-Agent 字段进行匹配,上例的 ExampleClient 是示例文本,不代表某个实际应用。它不能等同于按应用进程分流:多个请求可能使用相同字段,同一应用也可能产生不同字段,部分流量根本没有可供规则读取的内容。尤其对加密请求,不能假设客户端天然能看到其中的请求头。
如果 USER-AGENT 规则没有命中,应先确认字段是否可见、实际内容是否符合模式,再检查规则位置。不要为让一条规则生效而扩大到不必要的流量检查范围。涉及加密内容处理时,应独立评估授权、证书信任和隐私边界;本页地址与策略示例不要求开启额外的加密内容处理。能够用清晰域名表达需求时,通常更适合先从域名规则验证。
连接策略与 Global Routing 三姿态
规则告诉客户端“哪些请求属于这一类”,策略告诉客户端“这一类请求怎样处理”。PROXY、DIRECT、REJECT 是规则中的策略关键字;Global Routing 下的 Config、Proxy、Direct 则是整体运行姿态。两组名称有关联,但不是同一个层次。排查前必须同时记录当前姿态与命中策略,否则容易把姿态改变造成的结果误认为某条规则已经修好。
PROXY、DIRECT 与 REJECT
PROXY 表示把匹配请求交给代理策略,最终能否建立连接仍取决于出口选择、协议参数、认证信息与当前网络。它不承诺任意目标均可访问,也不自动生成服务器。DIRECT 表示直接连接目标,连接仍会经过当前设备接入的网络。REJECT 表示拒绝匹配请求,客户端可能以相应失败结果结束连接;它不是把请求改送到另一个服务器。
[Rule]
DOMAIN,api.example.com,PROXY
DOMAIN,local.example.com,DIRECT
DOMAIN,blocked.example.com,REJECT
FINAL,PROXY
三条示例分别表达代理、直接连接与拒绝处理,域名只是教学对象。若 api.example.com 命中 PROXY 后失败,下一步应检查出口,而不是假设客户端会退回 DIRECT。若 blocked.example.com 命中 REJECT,出现连接失败正是策略结果,不能再把这一结果当成服务器失效的证据。测试应先明确成功标准:允许访问、按指定出口连接,还是按预期被拒绝。
Config、Proxy、Direct 的比较用途
| 姿态 | 主要用途 | 排查时的观察点 |
|---|---|---|
| 配置 / Config | 按所选配置执行规则分流 | 文件、顺序、命中规则与策略 |
| 代理 / Proxy | 用于对照代理路径 | 所选出口和服务器连接能力 |
| 直连 / Direct | 用于对照当前网络路径 | 本地网络和目标的直接可达性 |
这里的三姿态描述用于建立排查思路,并不意味着系统中的每一类流量都必然被同样处理。系统流量、配置中的绕过项以及具体功能仍可能形成边界。对照测试应使用同一个目标和新建立的请求,保持网络环境一致,并查看实际记录。仅凭状态栏图标或某个页面能打开,无法确认所有请求走了哪一种路径。
如果 Proxy 可用而 Config 不可用,优先看目标是否被 DIRECT、REJECT 或其他更早规则处理,再检查当前 Config 文件是否正确。若 Config 与 Proxy 都失败,可以继续验证服务器地址、端口、协议和认证信息,并用其他已知可用目标区分出口整体异常与单个目标异常。Direct 可用只说明当前网络具备一条可行路径,不证明代理参数一定正确。
选中服务器与规则策略的关系
Home 中选中的服务器、配置中存在的策略组以及规则引用的策略名称,需要放在同一上下文里理解。简单配置可以使用 PROXY 交给当前代理策略;复杂配置若引用自定义策略名称,则必须确保该名称确实存在且指向有效成员。不要把别人文件中的自定义名称直接当成通用关键字复制,也不要认为修改服务器备注后所有引用都会自动保持有效。
协议参数决定代理连接本身的建立方式,与规则策略是相邻但独立的层。以 Trojan 为例,地址、端口、密码与 TLS 相关参数需要按已有服务器信息填写;把规则从 DIRECT 改为 PROXY,并不能修正错误的认证参数。相关字段的填写边界可查阅Trojan 参数说明,排查时仍要保持规则与服务器两条线分开。
REJECT 也不能代替内容过滤的全部需求。一个域名可能同时承载必需功能和希望拒绝的请求,整域拒绝可能影响登录、加载或同步。对于加密流量,域名级规则通常不能据此区分同一主机下的不同网页路径。需要更细的控制时,应先确认目标信息的可见性和功能边界,而不是不断追加范围更宽的关键词规则。
完成对照测试后,应恢复原计划使用的姿态并再测试一次。临时使用 Proxy 验证连接后忘记切回 Config,是“规则看似不生效”的常见原因;临时使用 Direct 后忘记恢复,也会产生类似误判。把当前姿态、服务器与文件写在同一条测试记录里,通常比保留大量没有上下文的成功截图更有利于后续维护。
匹配顺序与 FINAL:首条命中即停止
Rule 中最重要的阅读方法是从上到下逐行判断。请求命中一条适用规则后,采用对应策略,不会为了寻找“更具体”的规则继续向下扫描。DOMAIN 不会天然压过 DOMAIN-SUFFIX,域名规则也不会仅凭类型名称自动优先于地址规则。所谓优先级,首先就是配置中的位置;理解这一点,比记住更多规则关键字更能避免配置失误。
把例外放在概括规则之前
[Rule]
DOMAIN,api.example.com,PROXY
DOMAIN-SUFFIX,example.com,DIRECT
IP-CIDR,192.168.0.0/16,DIRECT,no-resolve
GEOIP,CN,DIRECT
FINAL,PROXY
这个片段先给 api.example.com 设置代理例外,再把同一域下其他请求交给 DIRECT,接着处理私有地址和 CN 地址归类,最后以 PROXY 兜底。每一行都有独立职责。若把后缀规则移到第一行,api.example.com 会先命中 DIRECT,后面的精确例外就没有机会生效。即使两行间插入注释或空行,也不会改变这种先后关系。
“例外在前”不是要求所有 DOMAIN 都放到整个文件最上方,而是要求同一判断范围内的窄规则先于宽规则。实际整理时,可按业务把规则分组,但必须检查跨组重叠。例如某个较早的 DOMAIN-KEYWORD 可能已经包含后续多个业务域名;某个地址段规则也可能覆盖后来希望特殊处理的目标。分组标题帮助人阅读,却不会给客户端创建新的优先级层。
FINAL 的结构与位置
[Rule]
DOMAIN-SUFFIX,example.com,DIRECT
FINAL,PROXY
FINAL 是此前尚未命中请求的兜底规则,写法只有类型与策略,不需要再加一个域名或地址字段。它通常放在 Rule 的末尾。若提前写入 FINAL,后续普通规则就失去了处理剩余请求的机会。文件中存在多个 FINAL 时,也不应把它们理解为逐级备用出口;应整理为一个明确的最终选择,再用前面的具体规则表达例外。
FINAL,PROXY 与 FINAL,DIRECT 代表不同的默认行为,不能笼统说哪一个总是正确。前者把未分类请求交给代理策略,后者把未分类请求交给直接连接。选择依据是希望默认路径是什么,以及前面的例外是否完整。复制配置时尤其要检查最后一行,因为前面大量规则相同,只改变兜底策略,也可能让大量未列出的目标使用不同出口。
用手工演算发现覆盖关系
检查一组规则时,选几个代表目标逐行演算:精确例外是否命中第一行,同域其他主机是否落到后缀规则,私有地址是否进入地址规则,剩余请求最终是否到达 FINAL。每次演算都写下停止位置,而不是只写预期策略。这样既能发现冲突,也能解释为什么某条看似正确的规则从未出现命中记录。
地址规则参与判断时,要额外注明是否已有目标地址,以及 no-resolve 是否让该行不主动解析。只有域名文本、没有地址上下文的纸面推演,不能可靠预测 GEOIP 的实际结果。若日志表现与演算不同,应优先核对客户端看到的目标信息,再核对当前生效文件。不要通过删除所有域名规则来强行让地址规则获得命中机会。
合并两份配置不是把 Rule 内容直接相接。第一份中的 FINAL 可能会截断第二份的所有规则,宽关键词也可能提前吞掉第二份的例外。正确做法是先分离各节,移出兜底规则,再按用途合并具体规则,最后加回一个 FINAL。相同对象不同策略的冲突要人工选择,完全相同的重复行可以在确认语义一致后清理。
对于维护中的长文件,建议把新增规则作为一个小变更提交到本地副本:记录插入位置、覆盖对象、预期策略与测试结果。运行一段时间后再合并同类项,避免每次排查都把新规则堆到最顶端。规则顺序应保留可解释的结构;当只有维护者本人记得某行为什么在这里时,后续更新与故障恢复都会变得困难。
Host 与 URL Rewrite:地址映射和请求处理
Host、URL Rewrite 与 Rule 经常出现在同一配置文件中,但不能用同一套方式理解。Host 为指定主机名提供静态地址映射,URL Rewrite 根据可识别 URL 的匹配条件执行相应处理,Rule 则选择连接策略。它们分别涉及“地址从哪里来”“请求如何处理”“连接走哪条路径”。一个问题同时牵涉多层时,应分开验证每一层是否符合预期。
Host:固定解析结果不等于指定出口
[Host]
service.example.com = 192.0.2.10
这里将 service.example.com 映射到示例地址 192.0.2.10。该地址来自文档示例地址范围,不是可供访问的服务。Host 行使用等号,不采用 Rule 中的逗号结构,也不能在后面直接追加 PROXY 来指定策略。若同一目标还需要特定连接方式,应在 Rule 中单独写规则,并通过实际连接记录确认目标地址与策略都按预期使用。
Host 适合目标地址明确且能够维护的场景,不适合随意固定经常变化的公共服务地址。域名背后可能存在多地区调度、故障切换或地址轮换;固定单一地址会绕过这些变化,并可能在一段时间后失效。添加映射时应记录用途、预期有效条件与移除方式,而不是把某次解析得到的地址直接作为长期修复。
HTTPS 请求中的域名还参与证书校验与服务选择。即使映射地址可以建立 TCP 连接,目标服务也可能因为证书、SNI 或虚拟主机配置而拒绝请求。Host 映射不会自动让任意地址拥有该域名的合法证书,也不会改变服务器认证参数。遇到证书错误,应核对目标服务配置,不能用关闭校验来代替对地址正确性的确认。
URL Rewrite:先理解匹配范围
[URL Rewrite]
^http://example\.com/old$ http://example.com/new 302
上例针对明文 HTTP 的一个精确路径做重定向示范:正则表达式匹配旧地址,目标 URL 指向新地址,302 表示相应的临时重定向处理。它不是域名分流规则,不能放到 Rule 节。点号写成反斜杠加点号,是为了表达字面域名分隔点;开头与结尾的锚点用来限制范围,避免把更长路径或额外字符也纳入示例匹配。
URL 中的查询参数也会影响匹配。上述结尾的美元符号意味着带额外查询串的地址不属于这个示例的精确范围;是否要允许查询串,应按真实需求重新设计表达式。不能为了“让它都命中”就随意删掉边界或增加宽泛通配。修改前先列出应匹配与不应匹配的样本,再逐个验证,有助于发现路径、参数与转义之间的差别。
HTTPS 可见性与循环风险
域名能够用于分流,不等于加密请求的完整路径和请求头天然可见。对于 HTTPS,路径位于加密内容中,不能仅靠域名规则推断 URL Rewrite 一定可以处理。涉及加密内容的进一步处理,需要独立理解证书信任、适用域名与隐私影响;本页示例选用 HTTP,就是为了不把这类额外前置条件隐藏在一个看似简单的重写片段中。
重写规则还可能产生循环:旧地址指向新地址,新地址又被另一条规则改回旧地址,浏览器就会不断重试或报重定向次数过多。也可能出现目标地址仍符合原匹配表达式,导致同一规则反复作用。测试时应观察跳转链,而不是只看最终页面是否出现;若无法解释链中每一步,应先缩小表达式并暂时移除相关重叠规则。
验证 Host 时,保持原有 Rule 不变,只比较目标地址来源;验证 URL Rewrite 时,先用明确的 HTTP 测试地址并确认重定向,再检查目标地址的分流结果。若一次同时修改三节,即使最终成功,也难以确认依赖关系。对正常业务请求,尽量保留原始配置副本,避免测试规则影响登录回跳、表单提交或其他带状态的请求。
配置来源更新后,Host 与 URL Rewrite 也需要复查,不能只看 Rule 有没有变化。地址映射可能已经过期,服务路径可能已经调整,曾经必要的重写也可能与新行为冲突。维护记录至少应包含目标、用途与撤销条件;对于无法说明来源和目的的条目,先在副本中停用并测试,再决定是否删除,比长期保留不明规则更容易控制影响。
验证与维护:从一条请求定位到一处修改
配置验证的目标不是证明“这份文件看起来完整”,而是让每一种预期行为都能由实际请求解释。一次有效测试至少应记录当前网络、Global Routing 姿态、Config 文件、所选服务器、目标域名与观察到的结果。没有这些上下文,同一页面前后两次表现不同,很可能来自缓存、旧连接、网络变化或出口切换,而不是刚刚编辑的那条规则。
按四层缩小问题范围
第一层确认请求是否进入当前客户端处理范围,连接开关、系统授权与正在使用的文件是否正确。第二层确认目标信息是否可用,包括域名与地址。第三层确认命中规则与策略是否符合预期。第四层才检查策略对应路径能否完成连接。按这个顺序检查,可以避免服务器明明可用,却因为误命中 REJECT 而被反复重填参数的情况。
Connectivity Test 可以辅助观察连接条件,但测试成功不等于真实业务请求的所有依赖都成功。不同测试方式的目标与协议可能不同,页面还可能请求多个域名。对异常网站,应选择一个具体失败请求,核对它的域名、地址、命中规则和失败阶段,再回到页面整体行为。Data 中的统计适合观察使用情况,不适合单独证明某一条规则的命中。
| 观察结果 | 先检查 | 下一步 |
|---|---|---|
| 规则没有命中 | 当前文件、姿态与前序规则 | 用实际域名逐行演算 |
| 命中 PROXY 仍失败 | 所选出口和服务器参数 | 固定目标,对照 Proxy 姿态 |
| 命中 DIRECT 仍失败 | 当前网络和目标可达性 | 检查目标地址、端口与解析 |
| 只在更新后异常 | 文件变化与出口选择 | 与更新前副本逐项比较 |
使用可回退的最小变更
每次只修改一条规则或一个相关设置,并保留修改前后的片段。若测试结果没有变化,先判断请求是否重新建立、是否命中另一个更早规则,再决定撤销还是继续调查。不要不断叠加新例外而不删除无效尝试;这样会让下一次测试面对更多变量。对于长配置,可以先在副本中保留必要 General 与少量 Rule,建立能够复现问题的最小范围。
[General]
bypass-system = true
dns-server = system
[Rule]
DOMAIN,api.example.com,PROXY
FINAL,DIRECT
这个诊断片段仅把一个示例域名交给 PROXY,其他请求默认 DIRECT,目的是突出观察对象,不是推荐长期使用的通用配置。应用前必须理解默认策略改变会影响其他请求。若它能得到预期结果,再把原配置的相关规则分组加回,定位是哪一组改变了命中。若它仍失败,则继续查域名信息、代理出口与目标服务,而不是直接扩展匹配范围。
更新、备份与敏感信息处理
配置备份应与服务器订阅信息分清保存。某些文件可能包含服务器、认证字段或带身份信息的链接,即使主要内容看起来只是规则,也应在分享前完整检查。提供排查材料时,保留节名、规则类型、字段结构与顺序,把真实域名按需替换为 example.com,移除账号与订阅信息。不要只涂掉截图中的一小段而忽略其他可识别字段。
应用更新通过 App Store 进行,应用获取与正版核验可查阅正版核验说明;配置更新则由你实际使用的文件来源决定。两种更新不应混为一谈,也不要仅凭应用更新后第一次访问失败就推断规则语法发生变化。先对照文件、姿态、服务器和网络,再检查具体设置项是否仍符合应用内说明。
对于服务商提供的订阅,更新前后应核对服务器项目是否重命名、参数是否调整,以及原选择是否仍有效。单条分享链接与订阅链接的作用不同,无法确定导入对象时可查阅分享链接与订阅链接的区别。本页只讨论已有信息的使用方式,服务器与订阅内容仍应从你的服务商处获取。
最后做一轮回归测试:精确例外、域名后缀、私有地址与 FINAL 各选一个代表目标,确认策略结果;若使用 Host 或 URL Rewrite,再分别检查映射与跳转链。测试完成后恢复计划使用的 Global Routing,保留可回退副本。常见连接问题可继续阅读使用说明,流量读数的口径见Data 流量统计说明。以可复现请求和清晰修改记录维护配置,比持续增加规则更有效。