正则表达式屏蔽——url.deny 精细控制
default.hosts 的局限性
default.hosts 基于根域名前缀匹配,粒度较粗。有时你需要更精细的控制:
- 屏蔽特定 URL 路径(如
example.com/ads/下的所有资源) - 屏蔽带特定查询参数的 URL
- 只屏蔽某类资源(如特定文件后缀的图片广告)
- 用注释组织规则
这时候就需要 url.deny。
url.deny 文件
url.deny 使用 Java 正则表达式语法,比 default.hosts 更灵活。配置特点:
- 每行一个正则表达式
- 忽视回车(跨行表达式可以用多行写)
#开头的行是注释- 空行被忽略
格式示例
# 屏蔽所有 banner 相关图片
.*banner.*\.(png|jpg|gif)$
# 屏蔽特定域名下的 /track/ 路径
example\.com/track/.*
# 屏蔽带广告参数的 URL
.*[?&]utm_(source|campaign|content)=.*
匹配对象
url.deny 匹配的是完整 URL 字符串,包括:
- http:// 或 https:// 协议头
- 域名 + 路径 + 查询参数 + 锚点
所以正则可以自由匹配任何部分。
与 default.hosts 的配合关系
| 场景 | 用 default.hosts | 用 url.deny |
|---|---|---|
| 整个域名树屏蔽 | ✅ | 不如 hosts 方便 |
| 精细路径控制 | ❌ | ✅ |
| 需要注释 | ❌ | ✅ |
| 多行正则 | ❌ | ✅ |
| 跨域名模式 | ❌ | ✅ |
两者配合使用效果最好:
- 先用 default.hosts 把明显的广告域名树全部挡掉
- 再用 url.deny 处理那些"漏网"的、需要精细路径控制的规则
Java 正则注意事项
urldeny 使用 Java 的 Pattern.compile() 语法,与 JavaScript/Python 有些差异:
| 特性 | Java 正则 | 与 JS 的差异 |
|---|---|---|
| 转义点号 | \. | 和 JS 一样 |
| 字符类 | [abc] | 一样 |
| 量词 | *, +, ?, {n,m} | 一样 |
| 分组 | (...) | 一样 |
| 非捕获分组 | (?:...) | 一样 |
| 边界 | \b, \A, \Z | 类似 |
| DOTALL | 需要 Pattern.DOTALL | JS 用 s flag |
| MULTILINE | 需要 Pattern.MULTILINE | JS 用 m flag |
如果不确定正则是否正确,建议先在本地用 Java Pattern 测试,或者先用最简单的形式测试。
实用规则示例
屏蔽常见广告追踪参数
# 屏蔽所有带 utm_* 追踪参数的 URL
[?&]utm_[a-z]+=.*
# 屏蔽带 fbclid 的 Facebook 追踪链接
[?&]fbclid=.*
# 屏蔽带 gclid 的 Google AdWords 追踪
[?&]gclid=.*
屏蔽特定路径
# 屏蔽 example.com/ads/ 下的一切资源
example\.com/ads/.*
# 屏蔽 example.com 域名下的 banner 图片
example\.com.*banner.*\.(png|jpg|jpeg|gif|webp)
屏蔽某些统计脚本
# 屏蔽常见统计域名下的脚本
.*(analytics|stat|tracking|count)\..*\.js$
与信息隐藏体系的关系
url.deny 是 uWeb 信息隐藏技术的一部分,官方文档总结的完整隐藏方案包括:
- 网络层面:default.hosts 根域名拦截 + url.deny 精细路径拦截
- DOM 层面:sitecss/sitejs 针对特定网站的元素屏蔽(CSS display:none 或 transform:scale(0))
- 浏览模式:长按窗口管理 → 仅图片/仅视频/禁用伪元素/禁用 iframe
- 全屏无干扰:长按 ☰ → 自动全屏播放(视频场景)
- 资源层面:长按 ☰ → 隐藏浮动信息、移除横幅、清空定时器、中断可疑事件
- JS 层面:长按设置 → 拦截外链脚本(配合 js.allow 白名单)
- 硬开关:直接关闭图像或关闭 JS