为什么 Adblock 到 Polipo 的过滤器转换不止需要正则表达式
评估 Adblock 到 Polipo 的过滤器转换时,要保留例外规则和请求上下文。
转换器必须保留规则的含义,而不只是搬运它的字符。浏览器过滤列表可能依赖页面加载的资源、资源类型和例外规则。仅基于 URL 的拦截列表所携带的信息更少。
对于已有的 Polipo 安装,其手册把 forbiddenFile 条目定义为域名或 POSIX 扩展正则表达式。因此,为 Python 引擎生成的正则在那份文件里并不自动有效。
从一个已声明的子集开始
- 只有在定义了锚点和分隔符行为之后,才转换无条件的 URL 拦截模式。
- 保留以 @@ 开头的例外规则。把它们的模式追加到拒绝文件里会颠倒其含义。
- 带有上下文选项的规则,例如对 script 或域名的限制,应排除在仅基于 URL 的转换之外,除非目标能够表示这些条件。
- 排除隐藏元素的规则:选择页面 DOM 元素需要另一套机制。
删除不受支持的选项可能把有条件规则扩大为无条件拦截。应当报告这些被跳过的规则,而不是悄悄声称转换完整。
历史上的 adblockparser 包可以解析并评估 Adblock Plus 规则的一个子集。它的 README 记录了被忽略的元素隐藏规则、依赖选项的匹配以及其他限制;其仓库已于 2026 年 6 月 24 日归档。请把它的输出当作需要对照目标引擎进行评估的材料,而不是对整个列表忠实转换的承诺。
考虑代理能看到的范围
对于普通 HTTPS 隧道,Polipo 的隧道过滤只能看到主机名和端口,看不到加密的 URL 路径。它的 forbiddenTunnelsFile 是独立的策略面。即使路径表达式翻译得完美,也无法匹配代理根本看不到的内容。
记录保留的子集,并在评估转换时同时检查预期拦截和预期例外。文件能够加载只证明语法被接受,并不证明过滤效果等价。