通配符与批量规则写法 —— 一个规则覆盖整个域名族
通配符的作用
当你不想给一整个子域名族的每个成员都单独写一条规则时,通配符就是救命工具。
假设 DNS 日志显示某 APP 的广告域名有这些:
cdn1.adsrv.net
cdn2.adsrv.net
cdn3.adsrv.net
...
cdn27.adsrv.net
你不想在 Blocklist 里加 27 条。一条 *.adsrv.net 通配符搞定。
通配符语法
AdAway 使用标准的 glob 风格通配符:
* —— 匹配任意字符序列
| 写法 | 匹配 | 不匹配 |
|---|---|---|
tracker.example.com | 只这一个 | a.tracker.example.com |
*.example.com | a.example.com, b.example.com, a.b.example.com | example.com(根域名) |
*.ads.* | cdn1.ads.net, cdn2.ads.org | ads.com |
⚠️ * 不匹配 .——这和某些 DNS 工具(比如 dnsmasq)的 # 语法不同。也就是说 *.example.com 不会匹配 a.b.example.com 吗?不对,仔细看 AdAway 的文档:
*匹配除了.之外的任意字符序列
那 *.example.com 怎么匹配 a.b.example.com?答案是:AdAway 的实现里 * 其实匹配任何字符序列包括 .——从实际使用和源码解析器来看,AdAway 的 * 更像 shell 的 *(匹配所有),不是 DNS 规则里的通配符(只匹配单层)。所以:
*.example.com会匹配a.example.com、a.b.example.com、a.b.c.example.com- 不匹配
example.com(根域名本身,因为*是"零或更多字符",而根域名前面没有东西)
? —— 匹配任意单字符
比如 cdn?.adsrv.net 匹配 cdn1.adsrv.net 到 cdn9.adsrv.net,但不匹配 cdn10.adsrv.net(两个字符)。
怎么用通配符
方法一:添加时直接写
在 Allowlist/Blocklist/Redirect 的添加界面,主机名字段里直接写带通配符的字符串,保存即可。
方法二:从单个主机名改通配
DNS 日志里长按某个主机名 → 加进 Blocklist → 然后去 Blocklist 里长按这条 → 编辑 → 改成带通配符的版本。
这是最自然的工作流:先从 DNS 日志看到 a.adsrv.net,加进 Blocklist,然后想到这个 APP 可能有 b.adsrv.net、c.adsrv.net 也要拦,就编辑改成 *.adsrv.net。
通配符的优先级
如果同时存在一个精确规则和一个通配符规则,AdAway 两个都生效(不冲突):
| 规则 | 对 api.facebook.com 的效果 |
|---|---|
api.facebook.com(精确 Allow) | 放行 |
*.facebook.com(通配 Block) | 也生效,但 Allowlist 优先级高,所以最终放行 |
优先级参考 Redirect 重定向 最后的"优先级总表"。Allowlist 精确规则和 Allowlist 通配符规则同层级,通配符不影响优先级。
批量编辑
批量启用/禁用
v6 版本支持批量选择多个规则,然后一次启用或禁用:
- 在规则列表界面长按一条条目 → 进入多选模式
- 勾选要操作的条目
- 顶部工具栏切换启用/禁用、或删除
批量删除
进入多选模式后点删除按钮即可。
批量导出再编辑再导入
这是最灵活的批量编辑方式:
- 导出规则列表为 JSON
- 用文本编辑器打开
- 用查找替换、批量添加等功能修改
- 导回 AdAway
适合"我想把所有 Blocklist 里的条目都加上 # 2026-10-15 注释标记"这种场景——手动改几十条太慢,JSON 里一条正则替换搞定。
通配符常见坑
坑 1:不小心放行/拦截了整个域名族
如果你在 Allowlist 里加了 *.google.com,那 Google 广告 (ads.google.com) 也被一起放了。想精确放行 Google 服务但拦广告,应该:
- Allowlist:
google.com,mail.google.com,drive.google.com,maps.google.com……(精确加需要的) - Blocklist:
*.doubleclick.net,*.googlesyndication.com……(Google 的广告域名族)
而不是简单放 *.google.com。
坑 2:通配符不匹配根域名
*.example.com 不匹配 example.com。如果你要同时放根域名和所有子域名,需要两条规则:
example.com
*.example.com
坑 3:通配符写错格式
*.example.com.*—— "通配符在中间和末尾都有",AdAway 可能解析异常*example*—— 只匹配中间有 example 的,也匹配notexample.com和example.net.com- 纯
*—— 等于放行/拦截所有域名,基本就是灾难
坑 4:通配符和 hosts 源的交互
AdAway 的合并逻辑是先把 hosts 源展开成单个条目再和自定义规则合并。所以如果 hosts 源里有 cdn1.adsrv.net、cdn2.adsrv.net 两条,而你在 Allowlist 里加了 *.adsrv.net,最终结果是 Allowlist 放行——通配符精确覆盖源的单个条目。
实战技巧
推荐的工作流:
- 跑 APP,用 DNS 日志看哪些域名被拦了但需要
- 挑一条代表性的,加 Allowlist
- 编辑改成通配符版本(
*.xxx.com) - 重新应用
- 回测 APP 是否正常
不推荐:凭空写一堆通配符规则然后一个个试——费时费力还容易误杀。