Shadowrocket 规则与配置参考
按配置段查语法,按匹配顺序查结果。适用于已持有自己的订阅或服务器信息、需要核对分流行为的 iPhone / iPad 用户。
首次导入和连接请先阅读快速上手教程;本页用于连接之后的系统查阅,不重复首次安装主线。客户端一次性买断 ≠ 线路套餐,本站不提供、不销售、不推荐节点或订阅。
- 配置段与参数
- 规则类型与策略
- 顺序与验证
01 / CONFIG STRUCTURE
配置文件结构:先区分服务器资料与行为规则
Shadowrocket 中的服务器资料回答“通过哪一个服务器建立连接”,配置文件回答“某个请求应采用什么处理方式”。两者相关,但不是同一份资料。用户已有的订阅通常用于导入和更新服务器条目;一个包含分流规则的配置文件则需要在 Config 中核对并启用。看到 Home 中已有服务器,并不能据此判断自定义规则已经生效。阅读任何配置之前,先记录当前选择的服务器、当前启用的配置文件,以及 Global Routing 的状态,后续排查才能保持条件一致。
四个配置段分别负责什么
常见文本配置使用方括号标记段名。[General] 放置通用参数,例如 DNS 与系统流量相关设置;[Rule] 放置请求匹配条件及对应策略;[Host] 为指定域名写入地址映射;[URL Rewrite] 按表达式处理符合条件的 URL。段名不是装饰标题,某一行所处的段决定了它如何被解释。把域名规则粘贴到 General 下,即使整行拼写正确,也不能当作 Rule 中的规则使用。
[General]
bypass-system = true
dns-server = system
[Rule]
DOMAIN-SUFFIX,example.com,PROXY
IP-CIDR,192.168.0.0/16,DIRECT
FINAL,PROXY
[Host]
localhost = 127.0.0.1
[URL Rewrite]
^http://example\.com/ https://example.com/ 302
这份片段用于识别结构,不是要求整份套用的通用配置。General 中的两行分别展示一个布尔参数和一个 DNS 取值;Rule 中的三行展示域名、地址范围与最终策略;Host 中的 localhost 是本机回环名称示例;最后一行展示 HTTP 到 HTTPS 的重定向写法。示例域名不代表实际服务,复制前应先明确自己的目标。特别是 FINAL 的取值会影响所有未命中的请求,不能只因为示例采用 PROXY 就照搬。
标点、段落与可读性
规则字段使用半角逗号分隔,参数赋值使用半角等号,段名使用半角方括号。中文输入法产生的全角逗号、引号或空格可能导致内容不按预期解析。每条规则单独占一行,不要把网页排版造成的折行误当作新的规则。阅读时可按“关键字、匹配值、策略、可选参数”依次拆解,但不是所有关键字都有相同字段数;FINAL 就不包含匹配值,不能机械地补成三列。
配置段的排列也不应理解为一条固定处理流水线。文件中 General 写在 Rule 上面,不表示每个请求都先执行全部通用参数再逐行执行其他段;Host 与 URL Rewrite 也不是 Rule 的后续规则。真正需要按从上到下阅读的是 Rule 内部的匹配顺序。把配置结构和规则优先级分开理解,可以避免通过移动整个配置段来“提高规则优先级”的无效修改。
在 Config 中核对启用对象
进入 Config 后,先辨认目前选中的文件,再打开需要阅读或编辑的对象。修改副本前应给副本一个能说明用途的名称,并保留原文件。保存编辑与启用文件是两个检查点:保存只说明文字已写入,不一定说明当前连接已经使用这份文件。返回文件列表确认选择状态,再核对 Global Routing。界面项目的位置可能随应用调整,判断依据应是文件名、选中状态与实际请求结果,而不是某个固定的屏幕坐标。
如果目前还不能确认应用身份,可先按正版核验说明核对开发者 Shadow Launch Technology Limited、官方图标和应用 ID 932747118。Shadowrocket 是 Apple 平台付费客户端,唯一获取入口是 App Store;系统要求以 App Store 页面标注为准。确认基础环境之后,再使用本页的局部片段进行有目的的编辑,比同时更换服务器和配置更容易判断问题来源。
02 / GENERAL
General 与 DNS:解析方式不是分流策略
General 用于配置全局性行为,但“全局参数”不等于 Global Routing 中的 Proxy。前者描述一组设置作用的范围,后者描述连接采用的路由模式。阅读配置时应把这两个概念分开。例如调整 dns-server 是修改域名解析所用的设置,并不会自动把所有请求改成 PROXY;反过来,把 Global Routing 改成 Proxy,也不能据此断言所有 DNS 查询采用了某个特定服务器。
从最小参数理解 General
[General]
bypass-system = true
dns-server = system
第一行启用系统相关流量的绕过设置,第二行使用系统 DNS。这里的 true 是布尔值,system 是参数取值,不是需要替换的服务器名称。系统相关流量的处理还受到系统网络行为和其他设置影响,因此不能把 bypass-system 理解为“所有 Apple 服务均按某个固定策略处理”。排查某一个域名时,仍应查看实际请求记录;只凭参数名推断具体请求一定被绕过,容易漏掉真正参与匹配的规则。
dns-server 与 Host 的用途也不同。前者决定解析过程使用的设置,后者为特定名称提供地址映射。若 Host 已对某个域名写入地址,继续更换 DNS 并不一定改变该名称的结果。排查前应先查找同名 Host 项,再观察缓存与新请求。系统、应用和远端都可能持有不同层次的缓存,切换一次 DNS 后立刻刷新同一个页面,不足以证明新设置有效或无效。
把解析失败与连接失败分开
域名访问通常涉及先获得地址、再连接目标等环节。域名无法解析时,规则看起来可能没有得到预期的 IP 信息;解析已经完成时,失败又可能发生在后续连接、TLS 或远端响应阶段。因此“网页打不开”不是 DNS 错误的同义词。先检查是否存在解析结果,再看请求采用的策略和服务器。如果只有某个网站失败,而其他域名在同样条件下可用,优先比较该网站的规则、地址与连接结果。
| 配置对象 | 主要作用 | 不能据此断言 |
|---|---|---|
dns-server | 指定 DNS 相关取值 | 所有业务请求都使用 PROXY |
[Host] | 指定名称与地址映射 | 连接自动获得有效证书 |
[Rule] | 匹配请求并选择策略 | 目标一定可以访问 |
何时才需要调整 DNS
只有当现象指向解析环节时,才有必要改变 DNS 设置。例如相同域名在不同网络下得到的解析结果不同,或者请求记录表明域名解析没有完成。调整前记录当前取值及测试网络,调整后使用同一个目标重新发起连接。不要同时修改 DNS、Global Routing 与服务器,否则即使恢复访问,也无法知道是哪一项变化起了作用。配置应能解释结果,而不是只保留一次偶然成功的组合。
使用加密 DNS 时,还要考虑其服务地址本身如何被访问。能写入一个解析服务地址,不代表当前网络一定能够连接它;如果解析服务的连接条件不满足,域名规则也无法替代该前置环节。本文不提供可直接替换的公共解析服务清单。需要填写此类信息时,应使用自己已确认可用的资料,并依据应用当前显示的参数格式填写,不把不同协议的地址语法互相混用。
最后还要留意 IPv4 与 IPv6。一个域名可能返回两类地址,只观察其中一类会遗漏实际连接路径。看到 IPv4 规则没有命中时,先确认请求是不是使用了 IPv6,而不是立即扩大规则范围。DNS 的选择、返回地址和地址规则应一起核对。有关解析方式的进一步说明见DNS 设置专题;这里的重点是先找出失败层次,再决定是否修改 General。
03 / DOMAIN MATCHING
域名规则:精确名称、后缀与关键词
当分流目标能用稳定的域名描述时,优先从域名规则考虑。与直接列出地址相比,域名条件更接近“某个站点或服务”的意图,也较少受服务器地址变化影响。但域名不是完整网址:协议、路径、查询参数和端口都不应直接粘贴到 DOMAIN 的匹配值中。例如浏览器地址栏中的完整 URL,需要先提取主机名,再判断是只匹配该名称,还是覆盖它下面的所有子域名。
DOMAIN:只匹配指定名称
[Rule]
DOMAIN,api.example.com,PROXY
DOMAIN,account.example.com,DIRECT
FINAL,PROXY
第一行针对 api.example.com,第二行针对 account.example.com。DOMAIN 不表达“包含这个词”,也不自动覆盖其他子域名。如果实际请求是 images.api.example.com,不能因为它看起来属于同一个业务,就认定第一行应该命中。精确规则适合处理少量明确例外:例如大部分请求采用最终策略,仅某一个主机名需要 DIRECT。使用前应从实际请求中确认完整名称,避免把页面显示的品牌名称当成网络请求的主机名。
DOMAIN-SUFFIX:按域名边界覆盖后缀
[Rule]
DOMAIN,private.example.com,DIRECT
DOMAIN-SUFFIX,example.com,PROXY
FINAL,DIRECT
DOMAIN-SUFFIX,example.com 会覆盖 example.com 及其子域名,例如 www.example.com。它按域名边界理解后缀,不是任意字符串结尾比较,因此不要把 notexample.com 当成这个后缀的正常覆盖对象。上例先为 private.example.com 写精确例外,再写宽泛后缀;如果交换这两行,后缀规则会先匹配该例外名称,精确规则便失去预期作用。规则的覆盖关系比行数多少更值得关注。
写后缀时通常不需要添加星号。把 *.example.com 当作 DOMAIN-SUFFIX 的标准值,会混淆通配符表达式与后缀匹配两种机制。也不要因为需要覆盖图片域名就把范围扩大到很短的公共后缀。范围越宽,误包含其他服务的概率越大。合理的起点是业务真实使用的注册域名,然后根据请求记录补充独立域名,而不是猜测所有请求都共享同一后缀。
DOMAIN-KEYWORD:范围更宽,也更容易误匹配
[Rule]
DOMAIN-KEYWORD,example,PROXY
FINAL,DIRECT
DOMAIN-KEYWORD 用于匹配域名中包含的关键词。这里的 example 不是一个完整域名,也没有 DOMAIN-SUFFIX 那样的域名边界含义,因此可能命中本来没有关系的名称。只有当你明确需要这种较宽的条件,并能检查其影响范围时才使用。若目标只是 example.com 及其子域名,后缀规则通常更符合意图。规则越短不代表越准确,关键词更少也不代表维护成本更低。
| 关键字 | 示例值 | 适用目的 |
|---|---|---|
DOMAIN | api.example.com | 为单个名称设置例外 |
DOMAIN-SUFFIX | example.com | 覆盖根域名及子域名 |
DOMAIN-KEYWORD | example | 按名称中的字符串匹配 |
页面域名不等于全部请求域名
一个页面可能分别向登录、图片、接口和静态资源域名发起请求。主页能打开但登录失败,不一定说明同一条规则忽好忽坏,也可能是另一组请求采用了不同策略。应在操作发生时查看请求记录,识别真正失败的名称,再决定是否新增规则。第三方资源域名可能同时被多个业务使用,不能只因它出现在某个页面中,就认定所有访问该域名的请求都应跟随这个页面的策略。
若请求记录中只有 IP,没有可用于匹配的域名信息,域名规则就可能不是正确的检查入口。这时应继续看地址规则、DNS 与请求产生方式,而不是堆叠更多类似域名。针对国际化名称或格式特殊的名称,也应以实际记录中的形式为准。完成修改后同时测试目标名称和一个相近但不应命中的名称,才能验证规则既覆盖了需要的范围,也没有把边界以外的对象一起包含。
04 / ADDRESS AND REQUEST
IP-CIDR、GEOIP 与 USER-AGENT 的适用边界
地址规则适合描述网络范围,不能直接替代域名规则。相同域名可能解析到多个地址,相同地址也可能承载多个域名;两种条件表达的是不同目标。如果需求是“访问某个域名时采用 PROXY”,先考虑域名规则;如果需求是“访问这个局域网网段时采用 DIRECT”,地址规则更直观。只有明确请求的目的地址与网络边界,才能判断某个地址规则为何命中,或者为何不应命中。
IP-CIDR:地址与前缀长度一起阅读
[Rule]
IP-CIDR,192.168.0.0/16,DIRECT
IP-CIDR,10.0.0.0/8,DIRECT
IP-CIDR,172.16.0.0/12,DIRECT
FINAL,PROXY
每一行的第二个字段由网络地址和斜杠后的前缀长度构成。192.168.0.0/16 表示一个地址范围,不是只匹配 192.168.0.0 这一台设备。10.0.0.0/8 与 172.16.0.0/12 也各自表示私有地址范围。这里把这些范围设为 DIRECT,是局域网访问的常见意图示例,但不代表每个实际网络都使用它们。应先确认路由器、设备或内部服务的真实地址,再判断是否需要保留相应范围。
前缀越短,覆盖范围通常越大。把一个单独设备误写成很宽的网段,会使其他目标一并匹配。排查时应同时核对地址是否属于该网络、掩码是否符合预期,以及规则是否位于更宽泛条件之前。不要把某次域名解析得到的公网 IP 长期当作该服务的完整范围;地址可能变化,也可能只对应一次就近分配。临时地址规则适合验证假设,不一定适合成为长期维护方案。
IP-CIDR6 与 no-resolve
[Rule]
IP-CIDR6,fc00::/7,DIRECT
IP-CIDR,192.168.0.0/16,DIRECT,no-resolve
FINAL,PROXY
IP-CIDR6 用于 IPv6 地址范围,上例展示本地用途地址范围的写法。IPv4 规则不会自动覆盖 IPv6,因此遇到双栈目标时,需要先查看实际使用的地址族。可选参数 no-resolve 表达“不为这一条 IP 规则额外触发域名解析”的意图;它不等于禁用全局 DNS,也不保证请求永远不产生解析。请求本来已有地址时,仍可能参与地址匹配。使用前应理解自己希望避免的解析发生在哪里。
GEOIP:依赖地址归类,不代表用户位置
[Rule]
GEOIP,CN,DIRECT
FINAL,PROXY
GEOIP,CN 按目的 IP 的地区归类进行匹配,不是在读取用户当前位置,也不是根据页面语言判断网站归属。归类结果依赖应用使用的数据,不能据此承诺所有相关域名都按同一种策略处理。一个服务可能使用分布式基础设施,实际地址与业务所在地并不一致。如果某个具体域名需要固定策略,显式域名规则通常比依赖地址归类更容易表达该需求,并且应放在这类较宽条件之前。
当 GEOIP 与域名规则同时存在时,要区分“条件满足”和“最终生效”。域名规则若已在上方匹配,请求通常不会继续使用下面的 GEOIP 策略;域名未命中时,地址归类才可能成为后续依据。看到某个目标没有按预期 DIRECT,应先查看先前规则,而不是立即认定地区数据出错。地址归类只是配置中的一个条件,不能脱离整体顺序单独解释连接结果。
USER-AGENT:不能假定所有请求都可识别
[Rule]
USER-AGENT,ExampleClient*,DIRECT
FINAL,PROXY
USER-AGENT 针对可获得的请求标识进行匹配,上例展示带通配符的模式。它不是按应用图标或应用名称选择流量,也不能保证覆盖某个应用的全部连接。尤其对于未进行解密的 HTTPS 流量,请求头通常不能直接用于这类判断。不要为验证本例额外开启解密;本页示例不依赖此类设置。仅当请求中确实存在可匹配信息时,才应把 USER-AGENT 当成可用条件。
05 / POLICY
Global Routing 与 PROXY、DIRECT、REJECT
Global Routing 的 Config、Proxy、Direct 是模式选择,Rule 中的 PROXY、DIRECT、REJECT 是规则的处理策略。两组词看起来接近,但处在不同层次。排查规则是否生效时,先看 Global Routing;如果当前不是按配置处理请求的 Config,就不能仅凭修改 Rule 推断连接结果会随之改变。尤其在临时切到 Proxy 或 Direct 测试之后,应记得恢复原来的模式,再验证自定义分流。
| 界面词 | 中文说明 | 适用检查 |
|---|---|---|
| Config | 配置 | 核对已启用配置及 Rule |
| Proxy | 代理 | 对照代理连接路径 |
| Direct | 直连 | 对照当前网络的直接连接 |
PROXY:采用代理路径,不代表远端必定成功
规则策略 PROXY 表达通过当前代理选择建立连接的意图。它不是服务器地址,也不会补齐服务器所需的认证和协议参数。若用户已有服务器资料中的地址、端口、凭据或相关设置错误,规则正确命中 PROXY 也可能连接失败。因此需要分别证明两件事:请求选择了预期策略,以及该策略所用的连接路径可用。把这两个检查混成一个“规则没生效”,会把排查方向带到错误的位置。
Home 中的服务器选择也应纳入记录。使用同一份配置但换了服务器,结果可能不同;这并不意味着 Rule 的语法发生变化。对于自定义策略或分组,应核对其名称和实际指向,不要把未定义的名称写入示例。本文统一使用三个内置策略,避免让配置片段依赖额外的分组定义。需要进一步检查 Trojan 参数时,可查阅Trojan 参数说明,不要通过修改域名规则修正协议参数。
DIRECT:采用当前网络的直接连接
DIRECT 不表示停止 Shadowrocket,也不表示关闭系统中的 VPN 配置。它是在当前处理流程中选择直接连接目标。目标是否可达仍取决于当前网络、解析结果和服务自身状态。对局域网目标使用 DIRECT 常常符合访问意图,但还需要设备处于相应网络中;若设备不在同一网络,或局域网服务没有监听对应地址,DIRECT 规则本身不能建立原本不存在的网络连通性。
REJECT:明确拒绝匹配请求
[Rule]
DOMAIN,blocked.example.com,REJECT
DOMAIN-SUFFIX,example.com,PROXY
FINAL,DIRECT
第一行拒绝指定名称,第二行使其他符合后缀的请求采用 PROXY,最后处理剩余流量。REJECT 适合明确不希望连接的目标,不应拿来代替一个尚未想清楚的最终策略。若被拒绝的名称同时承担登录、验证或内容加载功能,页面可能出现局部异常。修改前应理解该名称的用途,修改后检查页面关键操作,而不是只看主页是否能显示。
拒绝策略也不等同于某种页面清理承诺。网页中看到的内容与网络请求并非一一对应,单个域名还可能承担多个功能。为了阻断某一资源而使用过宽的后缀或关键词规则,容易同时影响正常请求。应从精确目标起步,通过请求记录确认条件,再考虑是否需要扩大范围。若出现新问题,先撤回刚添加的拒绝规则,避免继续叠加例外掩盖原有错误。
FINAL:为未匹配请求指定去向
FINAL 是不带匹配值的最终规则,常见写法是 FINAL,PROXY 或 FINAL,DIRECT。它与全局模式不是同一个概念:FINAL 仍属于 Config 下的规则配置,仅处理前面没有匹配的请求。选择哪一种策略取决于预期默认行为,不能把某个值当作所有人的正确答案。采用 PROXY 时,应确认用户已有的服务器可用;采用 DIRECT 时,应接受未列出的目标会按直接连接处理这一结果。
如果三个模式下的现象不同,记录差异而不是直接下结论。Direct 可用而 Proxy 失败,可能需要检查服务器路径;Proxy 可用而 Config 失败,可能需要检查命中策略及其他配置项;三者都失败,也可能是目标或当前网络问题。具体判断仍需要连接记录配合,不能把模式切换结果当作能够排除所有其他原因的单一证据。
06 / FIRST MATCH
匹配顺序与优先级:不是自动选择最具体规则
Rule 的基本阅读方式是从上到下检查,先命中的规则决定对应处理。不能假定 DOMAIN 一定优先于 DOMAIN-SUFFIX,也不能假定地址规则天然排在域名规则之后。关键字描述匹配条件,不替你完成业务优先级排序。为了让配置容易维护,可以先放明确例外,再放较宽的域名范围,然后放地址范围与地区条件,最后放 FINAL;这是一种组织方法,不是应用自动施加的排序规则。
先用反例识别被遮蔽的规则
[Rule]
DOMAIN-SUFFIX,example.com,PROXY
DOMAIN,private.example.com,DIRECT
FINAL,DIRECT
private.example.com 同时满足前两行条件,但第一行已经覆盖它,因此下面的 DIRECT 例外不能实现预期。将第二行写得更长,或者在末尾重复一次,并不能提高它的优先级。需要做的是调整相对顺序,让较窄的例外先被检查。实际排查时,从文件顶部向下寻找第一个可能覆盖目标的条件,比只搜索自己刚添加的那行更有效。
[Rule]
DOMAIN,private.example.com,DIRECT
DOMAIN-SUFFIX,example.com,PROXY
FINAL,DIRECT
调整之后,private.example.com 先命中精确规则;其他属于 example.com 的名称再命中后缀规则;剩余请求落到 FINAL。这个结果来自顺序与条件共同作用,不是来自 DOMAIN 获得了固定的最高优先级。若未来在更上方加入一个覆盖 private 的 DOMAIN-KEYWORD,仍可能改变结果。因此每次新增宽泛条件,都应检查它前后已有的例外,而不是只验证新增规则本身。
FINAL 为什么应该位于末尾
FINAL 没有需要进一步比较的域名或地址条件,表达的是前面未匹配时的处理。把它提前放在其他业务规则上方,会使后面的规则失去正常参与匹配的机会。配置较长时,尤其要检查是否出现多个 FINAL:从不同片段拼接而来的文件,可能在中间已经包含一个最终规则。应先理解每份片段原来的边界,再合并内容,不能简单地把完整 Rule 列表首尾相接。
重叠地址与解析条件也要按顺序检查
地址规则同样存在包含关系。一个较宽的网段可以覆盖较窄的网段,地区条件也可能覆盖某个目标地址。需要为单独范围设置例外时,应放在较宽条件前面。同时,域名请求能否参与某条地址规则,还与是否已有目的地址、是否允许为匹配触发解析等条件有关。因此仅凭地址数学上属于某个范围,还不足以解释所有匹配现象;需要把规则顺序与当时可用的信息一起看。
不要把 Host 改写地址的效果误认为 Rule 的顺序变化。Host 与 DNS 可能改变后续可用的地址,而 Rule 中的地址条件再对这些信息进行判断。同样,URL Rewrite 也不是把某一条域名规则自动提升优先级的工具。文件的其他配置段会影响请求环境,但 Rule 里的先后关系仍应独立检查。排查时把“条件输入变了”和“规则位置变了”分别记录,才能避免因果混淆。
用命中矩阵验证边界
| 测试目标 | 预期命中 | 预期策略 |
|---|---|---|
private.example.com | 精确例外 | DIRECT |
www.example.com | 域名后缀 | PROXY |
example.net | FINAL | DIRECT |
测试目标应包含一个明确应命中的对象、一个位于相邻范围的对象,以及一个不应命中的对象。只测前者,容易漏掉过宽规则造成的影响。示例域名用于阅读矩阵,实际测试请换成自己有条件核对的目标,并记录当次请求的域名、地址和命中策略。若目标复用了已有连接,新的规则可能尚未参与一次全新的连接判断,应在保存和启用后重新发起请求。
对于远程来源或较长的配置,建议先在副本里构造最小反例:保留与目标相关的少数规则和一个 FINAL,验证顺序,再把修正带回完整配置。最小反例不是长期替代配置,而是帮助证明“哪一个覆盖关系造成了问题”。当问题可以用两三行稳定复现时,后续维护就不必依赖不断增加规则来试错。
07 / HOST AND URL REWRITE
Host 与 URL Rewrite:映射地址和改写网址分别处理
Host 处理名称与地址的对应关系,URL Rewrite 处理符合表达式的网址,两者都不等同于选择 PROXY 或 DIRECT。访问失败时,应先说明需要改变的到底是什么:是同一个域名应解析到另一个地址,还是旧网址需要跳转到新网址,抑或只是希望连接经过另一条路径。前两种需求才可能涉及本章,第三种应回到 Rule。为了分流而修改 Host,往往会引入额外的地址和证书问题。
Host 的最小示例与作用边界
[Host]
localhost = 127.0.0.1
左侧是名称,右侧是地址;localhost 与 127.0.0.1 表示本机回环示例。这里的“本机”指发起连接的设备自身,不是路由器,也不是所选代理服务器。不要把这个地址用于需要访问远端服务器的业务。写入一个映射只提供地址信息,不会让该地址自动运行所需服务。若目标端口没有监听、网络不可达或服务配置不符,名称能够对应到地址也仍然可能连接失败。
为真实域名固定地址之前,需要确认这个地址由谁维护、是否稳定,以及是否允许这样访问。很多服务根据地区和负载动态返回地址,固定其中一个结果可能破坏原本的调度。映射还可能掩盖正常 DNS 的变化,让后续排查误以为解析服务一直返回旧地址。因此 Host 适合明确、可控的映射需求,不适合把一次临时解析结果无限期保存下来。
Host 不会替代 TLS 验证
HTTPS 连接还涉及请求域名与证书等条件。把域名映射到某个地址,不等于该地址能提供与此域名相符的服务,也不会自动修复证书名称不匹配。遇到 TLS 错误,应核对目标名称、地址和服务端配置,不应把关闭校验当作常规修正。测试结束后若不再需要映射,应及时移除,并在重新发起连接时核对实际地址,避免旧配置影响其他诊断。
URL Rewrite 的三个组成部分
[URL Rewrite]
^http://example\.com/ https://example.com/ 302
这行依次包含匹配表达式、替换目标和重定向状态码。开头的 ^ 表示从字符串起始位置匹配,example 后面的反斜杠用于把点号按普通字符处理;如果省略,正则表达式中的点号通常表示任意字符,会扩大匹配范围。末尾的斜杠也属于条件的一部分。这里使用 302 展示临时重定向,不应由此推断它会修复所有 HTTP 访问,或自动保留原网址的路径和查询参数。
示例的替换目标是固定网址,未显式保留被匹配网址的其余部分。如果真实需求包含路径或查询参数,应先规划捕获范围和替换方式,再用少量可控目标测试。不能仅因为起始域名相同,就把登录回调、接口请求与普通页面都重定向到站点首页。过宽改写可能破坏请求语义,甚至使页面出现循环跳转。改写后的目标若又符合另一条改写条件,还需要检查相互作用。
HTTPS 的可见性限制
完整 HTTPS 路径与请求内容通常处于加密连接中,不能假定只添加 URL Rewrite 就能对所有加密请求生效。本章不要求配置 HTTPS 解密,也不把证书安装作为规则分流的前提。若你的目的只是按域名决定去向,应使用域名规则,不必为获得完整 URL 而增加其他设置。判断功能是否适用,应以当前实际可见的请求信息和应用支持的处理条件为准。
这两个配置段的测试都应包含撤销步骤。先保存原值,再添加单条映射或改写,确认目标行为,最后撤销并复测,观察现象能否随改动稳定变化。若撤销后问题仍在,应考虑缓存、已有连接或目标服务变化,而不是继续叠加条目。想从完整文件角度复查四段关系,可阅读配置文件结构解读;本章的原则是把影响范围限制在能够解释和验证的范围内。
08 / CHANGE AND VERIFY
配置修改与故障定位:建立可重复的验证过程
配置正确与访问成功是两个相关但不同的结论。正确的规则可能选择了一条暂时不可用的路径;一次成功访问也可能来自缓存或已有连接,未必证明新规则参与了判断。可靠的验证需要固定测试条件、保存原始配置、一次只修改一个因素,并记录新请求的结果。本章把前面各类规则整理成一个可回退的过程,适合用于单个域名异常、修改后无变化或配置更新后行为改变等情况。
第一步:记录基线,不先改配置
先记录当前网络类型、Global Routing、启用文件和所选服务器,再描述问题发生在哪个具体操作。不要只写“不能用”,而应区分主页打不开、图片不显示、登录失败、接口请求失败或局域网设备无法访问。确定一个可重复触发的动作,尽量固定同一个目标。若问题本来就间歇出现,需要先多次观察基线,否则修改后的偶然成功很容易被误判为修正有效。
第二步:保存副本,缩小改动范围
在 Config 中保留原文件,再编辑副本。先查看相关段是否已有同类规则、是否出现重复条件、是否存在提前的 FINAL。对于单个域名问题,可以先添加一条范围最窄的 DOMAIN 例外,而不是立即增加宽泛关键词。若要调整 DNS,先不要移动 Rule;若要调整 Host,先不要更换服务器。这样在结果变化时,才能把变化与某一个明确的改动建立联系。
[Rule]
DOMAIN,api.example.com,PROXY
DOMAIN-SUFFIX,example.com,DIRECT
FINAL,PROXY
这份局部示例用于验证精确例外:api.example.com 采用 PROXY,其余符合后缀的名称采用 DIRECT,其他请求采用最终策略。逐行解释之后,再把自己的目标与预期策略对应进去。不要直接用示例域名测试真实连通性,也不要把整个片段追加到已有 FINAL 后方。若现有文件结构复杂,先在副本中做最小复现,确定逻辑成立后再合并回需要长期维护的配置。
第三步:保存、启用,再发起新请求
完成编辑后检查保存结果,返回 Config 核对启用对象,再将 Global Routing 设为 Config。重新发起目标操作,必要时断开后重新连接,以减少已有连接复用对观察的影响。重新连接不意味着所有应用缓存都会消失,因此还需结合请求记录判断是否产生了新的网络请求。测试中不要把“页面显示未变化”直接等同于“规则未变化”,页面可能根本没有重新请求相关资源。
第四步:先查命中,再查连接
请求采用的策略不符合预期时,回到 Rule 顶部检查覆盖关系、实际主机名、地址族与 Global Routing。策略符合预期但仍失败时,再检查所选服务器、协议资料、DNS 与目标响应。若仅某个网络失败,应比较网络条件;若仅某个服务器失败,应比较服务器连接结果。不要在策略已经正确时继续增加重复规则,因为重复项不能修复认证错误、不可达地址或目标服务异常。
| 观察结果 | 优先核对 | 暂不扩大 |
|---|---|---|
| 策略不符合预期 | 模式、文件、条件与顺序 | 服务器参数改动 |
| 策略正确但连接失败 | 连接路径、解析与目标 | 重复分流规则 |
| 修改后没有新记录 | 是否产生新请求或复用连接 | 规则匹配范围 |
| 更新后行为改变 | 文件内容与启用对象的差异 | 无依据的整体替换 |
第五步:回归相邻目标,并保留回退记录
目标恢复后,还要检查同一后缀下的其他请求、一个不属于该范围的目标,以及可能受影响的局域网访问。修改最终策略时,回归范围应更广,因为所有未命中请求的去向都可能改变。记录应包含改了哪一行、为何修改、怎样验证以及如何恢复,不需要保存完整的敏感请求内容。长期配置的价值在于后来仍能理解,而不是只在修改当天看起来可用。
若仍无法定位,可按开关已打开却无法连接的排查顺序继续检查,或在疑难解答中查找对应分类。需要重新核对导入和连接流程时,回到快速上手教程;涉及购买与设备兼容性时,查阅App Store 正版说明,系统要求与是否通用购买均以 App Store 页面标注为准。不要把重新购买客户端当作解决规则问题的步骤。