TL;DR:Surge 模块规则冲突不要靠肉眼猜。先关掉全部模块,只保留基础 profile;再按顺序逐个打开,每次只观察一个目标域名的 Rule、DNS、MITM 和 Script 变化。

Surge 的模块很好用,也容易叠太多。一个去广告模块、一个流媒体模块、一个 DNS 模块、一个自写规则补丁叠在一起,最后某个 App 打不开,日志里却只看到「命中规则」。这时真正要查的是:这条规则是从哪里来的,DNS 结果有没有被改,脚本有没有提前处理请求。

先做最小复现

建立一个临时排查表:

状态模块目标域名DNS 结果命中规则最终策略
基础 profile全关example.com记录原值记录原值记录原值
加模块 AAexample.com对比变化对比变化对比变化
加模块 BA+Bexample.com对比变化对比变化对比变化

不要一次开回全部模块。只要某一步结果变化,就把那一步的模块内容打开看。很多冲突不是「规则写错」,而是模块新增了一条更靠前的规则,或改了 DNS 后让原规则不再命中。

模块顺序不是摆设

Surge 的模块会把内容合并到当前 profile。常见冲突有三类:

  1. 同名策略组被引用,但你的主配置里没有这个策略组。
  2. 模块追加了更具体的 DOMAIN 规则,覆盖了你后面预期命中的规则。
  3. 模块里的 DNS Rewrite 让域名解析结果变化,导致 IP-CIDR 或 GeoIP 规则接手。

遇到这类问题,先把模块下载到本地,查它到底改了哪些段落。只看模块名称很容易误判,因为很多模块同时包含 Rule、MITM、Script 和 DNS。

DNS 副作用最容易漏

DNS Rewrite 和 Rule 是两条线。你可能以为某个域名命中了代理策略,实际它已经被 DNS 改写到另一个地址,后续连接命中了完全不同的规则。

排查时打开 Surge 的最近请求,重点看:

  • 请求的原始域名是什么。
  • DNS 结果是否被 rewrite。
  • 是否出现 REJECTDIRECT 或某个意外策略。
  • 命中的规则来自主配置还是模块。

如果目标是 App 内请求,还要确认 MITM 是否开启。没有抓到域名,不代表没有请求;也可能是证书、HTTPS 解密范围或 App 自身连接方式导致日志不完整。

处理策略组命名问题

模块作者常用 PROXYProxyFinalREJECT 这类策略名。你的主配置如果叫 🚀 Proxy节点选择,模块规则引用的策略就可能不存在,或者被 Surge 自动映射到非预期位置。

最稳的做法是给常用模块保留一组固定别名。例如保留 PROXYDIRECTREJECT,再在自己的策略组里做二级选择。这样模块更新时不容易因为名字变化而失效。

使用配套订阅线路导入策略组后,也建议先把组名整理成稳定英文名,再叠加模块。排查时中文、符号和表情都可能增加对照成本。

不要同时改三件事

Surge 排障最怕同时更新订阅、更新模块、改 DNS。这样即使问题消失,也不知道是谁修好的。建议顺序是:固定订阅和策略组,先定位模块;模块稳定后,再处理 DNS;最后再恢复脚本和 MITM。

快速修复清单

  • 关闭全部模块,确认基础 profile 正常。
  • 按顺序逐个启用模块,每次只测一个目标。
  • 查看最近请求,记录命中规则来源。
  • 检查 DNS Rewrite、Script、MITM,不只看 Rule。
  • 统一策略组命名,避免模块引用不存在的策略。
  • 模块更新前保留上一版 URL 或本地副本。

最后把冲突模块单独留一份注释,写明它改了哪些段落。下次 Surge 或模块更新后,同类问题能直接对照,不用从头猜。

相关阅读