过滤名单/过滤文件功能是 Proxomitron 新加入的非常强大的功能之一。事实上 "过滤名单" 这个词并不能确切地描述这个功能,因为它们所能做的并不仅仅是 "过滤"。其实它们是普通匹配表达式的扩展形式。
你会常常在规则的 URL match 部分使用它们,但这不代表它们只能被用于 URL match。一个过滤名单可以包含任何匹配命令 - 甚至是调用其他名单!
简单的说,过滤名单就是包含匹配条目列表的文本文件。Proxomitron 会由上而下检测名单里的每一行直到匹配成功 - 否则会返回匹配失败。,每个名单都有一个名字(在 settings 对话框里),并可以在匹配表达式里用 "$LST(名单名字)" 随意调用。
Proxomitron 允许最多 255 个名单,一般可以用来存放需要过滤的 URL,允许接收 cookies 的网站,允许或禁用 javascript 的网页,或其他。如果创建一个新的名单,可以按以下步骤...
- 首先,使用任何文本编辑器(像是 Windows 自带的记事本)来创建一个列表。并保存为后缀名为 txt 的文件。
- 接下来,使用 "config" 对话框里的 blockfile 标签来加入该名单。点击 "Add" 来选择你刚刚创建的文件,并给它起个名字。这个名字可以和该文件的名字不同,是用来在 Proxomitron 内部使用的。这样你可以在不更改任何规则的情况下随意改变实际的过滤文件。
- 最后,要在规则里任何地方使用该名单时,只要使用 $LST(过滤名单的名字) 语句就可以了。Think of it a bit like including your list at this point.
例如,如果你有一个像这样的匹配表达式...
(Keitarou|Naru|Suu|Mitsune|Motoko|Shinobu|Mutsumi|Kame)
你可以像这样创建一个过滤文件..
# # Sample List LoveHina.txt # Keitarou Naru Suu Mitsune Motoko Shinobu Mutsumi Kame
接着,在 Proxomitron 里加入这个文件并命名为 "LoveHina",然后用 "$LST(LoveHina)" 替换规则里原先的 "(...|...|...)" 部分。和你想的一样,这在匹配大量不同文本时非常有用。不仅仅是因为名单更容易维护,更因为名单可以被复数规则调用!
反匹配
你可以在某行的开头使用字符 '~' 来代表该行是 "白名单"。这可以用来限制一个过滤名单所匹配的文本。只有在名单里有任何匹配成功时,Proxomitron才会检查这些反匹配。 只有 所有 的反匹配都被匹配时,名单才会返回 "true"。例如...
# # Another sample list # an example of using `~` to exclude # *.gif ~*/gam.gif
第一行会匹配所有结尾是 ".gif"的条目。但是第二行会检测是否是 "/gam.gif",如果是则不匹配。这样可以保证 卡美拉 这样的图片不会被匹配 (think of it as a Turtle Excluder Device)。
进一步的解释
名单也可以在规则的替换文本部分被调用。如果这样的话,它们就不是用来匹配某些值的了,而是用来将一个位置变量设置为某些值。例如,用 $CON(#,#) 和 $SET(#=...) 两个匹配命令的组合,替换文本的值可以根据连接数而循环(像是多重 UA 或是浏览器版本)....
# # A sample value rotation list (named "MyList") # $CON(1,3)$SET(0=Value One) $CON(2,3)$SET(0=Value Two) $CON(3,3)$SET(0=Value Three)
会在被调用时把这三个值依据连接数的不同而取其中一个存入 \0。你可以像这样在替换部分调用...
$LST(MyList) \0
首先调用名单并设置 \0 的值,然后输出它。
分割不是什么难事
一般来说,名单里的每行都被当作一个独立的匹配表达式来对待。但如果是很长的表达式,是可以被分割为多行的。只要对非独立行行首缩进就行了。例如...
taste (this|that|these|those|the other thing)
也可以被写成....
taste ( this| that| these| those| the other thing)
两者效果完全相同,但为了阅读方便,你可以把过长的表达式分割为多行 - 行首或行尾都会被忽略。
关于注释
另外,从以上例子你应该能看出,在名单里通过在行首标上 "#" 可以注释该行。注释通常会被忽略,但每个名单的开头几行都会被读取并搜索特定的对名单有影响的 "关键字"。目前一共有六个关键字:"NoAddURL", "junkbuster", "NoHash", "NoUrlHash", "NoPreHash", 和 "Logfile"。
"NoAddURL" 可以将该名单从系统托盘菜单的 "Add to blockfile" 隐藏。这样可以不显示那些不需要用于 URL match的名单,保持干净整洁的菜单。
"JunkBuster" 会让 Proxomitron 以 JunkBuster 的方式读取并解释该名单。这种方式可能并不完美,但似乎对于大多数 JunkBuster 的名单都可以正常解释。(译注:JunkBuster 是一款类似的用于过滤广告和cookies的代理软件,不过目前已经停止维护,所以下面一段关于 JunkBuster 的说明就不翻译了。)
Note that due to differences in methodology, designing your own list by adding URLs as you find them will likely be more efficient. In particular, JunkBuster processes hostnames in reverse (root first). Proxomitron treats a URL the same as any random text, so you're better off not using an initial wildcard. For instance, "(www.|)somehost.com" will be much faster than "*somehost.com". If you need a leading wildcard try "[^/]++somehost.com". It's a little better than '*' since it only scans up to the first "/" in the URL.
"NoHash", "NoUrlHash", 和 "NoPreHash" 都是用来禁用各种对名单的哈希算法的。NoHash 禁用所有的哈希算法,节省那些很少被调用的名单所占用的内存,适合对过滤速度要求不高的场合。"NoUrlHash" 和 "NoPreHash" 会禁用特定的哈希算法(参见下面的哈希部分)。不过这些都是极少甚至完全不需要的命令。
"Logfile" 是一个特殊的命令,告诉 Proxomitron 不要将该名单当作普通的过滤名单载入或处理。这在用 $ADDLST() 命令维护一个消息记录用的名单时很有用。
一般来说 Proxomitron 将过滤文件载入内存并按匹配表达式解析。但是,作为记录文件,这样不仅会额外占用内存,更可能由于文件内容完全不符合匹配表达式而产生解析错误。
想要创建一个消息文件,只要创建一个普通的过滤名单,并在开头几行标明 "LOGFILE"。例如...
##
## Proxomitron log file (LOGFILE)
##
然后在任意的过滤文件里添加该名单。需要写入记录时,只要使用 $ADDLIST(消息记录文件名, 需要添加的文本) 命令。
需要访问该消息文件时,只要使用 Proxomitron 的 "Edit blockfile" 选项。此时 Proxomitron会先关闭该文件以去除所有未写入的数据,然后用默认编辑器打开它。和其他过滤名单不同,为了更快地添加新数据,即使没有在写入数据,Proxomitron 也会保持消息文件的 "打开" 状态。
过滤名单缓存(哈希)
在过滤名单里大量使用 "OR" 函数的另一个好处是速度。Proxomitron 可以对部分名单条目使用哈希算法进行索引,但并不是所有的条目。这会在访问超大名单时快 很多很多。通常 Proxomitron 的处理速度很快,所以你并不需要知道这些是如何工作的,但是如果你想让你的过滤名单尽可能更快的话,这里有一些提示...
首先, Proxomitron 检查名单里的所有条目,看哪些是可以被索引的。如果一个条目可以,Proxomitron 会把该条目加入一个 "可索引" 列表;如果该条目不能,Proxomitron 会把它加入一个 "不可索引" 列表。"不可索引" 列表里的条目在每次检查该名单时都会被扫描一遍。当然,如果全部条目都在 "可索引" 列表里会比较好一些。
Proxomitron 有两种索引方式 - fixed prefix 和 URL style index。名单里的每项都会被检测是否可以被这两种方式的任意一种索引。总的索引名单则是这两种索引的混合。
"fixed prefix" 非常简单,就是以普通字母和数字而不是任何通配符开始的表达式。通配符之前的 prefix 越长,就越有可能被索引。很多用户添加的 URL 都符合这种形式,但其实非 URL 的名单也可以符合这种形式。这里是一些符合的表达式...
www.somewhere.com 127.0.0. shonen(kinfe|) foo(bar|bat)*bear
"和" 函数也可以被索引,例如 "this*&*that"。但是不在括号里的 "或" 函数像是 "this|that" 并不会被索引,因为它以两种不同的值开始。这种情况下把它们分别放在两行里会更好一些。
URL style hashes 主要是用来索引 URL 名单的,目的是允许一些条目以通配符开始,以便匹配主机名。URL style hashes 会在名单里寻找主机名的结束标记(":" 或 "/"),如果找到了就会索引该项。另外在开始的通配符和结束标记之间不能再有别的通配符。有效的通配符包括 "*", "\w", "[...]+", "[...]++", 和 "(...|)"。这应该可以包括绝大多数有用的通配符了。一些例子...
*somehost.com/(anything|after|here|is|fine)/\w.html \wsomehost.com/ [^.]+.somehost.com/ [^/]++somehost.com/ (www.|)somehost.com:[0-9]+/ ([^/]++.|)somehost.com/
但是下面这样的...
([^/]++.|)somehost.*/ ([^/]++.|)somehost.(com|net)/
不会被索引。这种情况写成如下两项会更快一些...
([^/]++.|)somehost.com/ ([^/]++.|)somehost.net/
有一点过滤名单作者必须注意到的变化是,当使用以通配符开始的条目时,一定要写全主机名,包括 "/"。以前这是不必要的。因此...
([^/]++.|)microsoft.
最好写成...
([^/]++.|)microsoft.com/
同时也要尽量避免使用过多的或函数。最好不要把表达式写成这样...
www.(ad(server|engine|banner)|banner(site|click|)).(com|net)
相反的,把上面的主机名全部写一遍还会更快一点,也更容易维护。
名单内部...
如果想知道你的滤名单的具体信息 - 包括它们的索引情况,每个条目的检测频率,和每个条目的匹配频率,Proxomitron 有一个专门提供此信息的 URL... 、
这个 URL 里你可以看到所有已载入名单的情况,包括它们的文件名,条目数量,和已经被索引的条目数量。点击名单名字可以查看到该名单每个条目的详细情况。如果你追求名单的效率最大化,这个 URL 会很有帮助。
限制...
过滤名单有一些限制使它们与由 "|" 连接起来所组成的过滤条目有所不同。主要体现在名单只在自己的范围内操作。例如,如果你有一个这样的匹配...
www.$LST(hosts).com和这样的名单...
# # Host list # adsite adsite-2以上名单无法匹配 "www.adsite-2.com",因为名单自己并不知道该匹配需要 ".com"。为了避免这种情况,一定要将匹配写清楚。例如,可以将后面的 "." 写进名单里...
(译注:我尽量按照作者的原话意译,但仍然觉得表述不够清楚。本例中,www.adsite-2.com 的 www. 部分会先被 Proxomitron 匹配,然后 Proxomitron 告诉名单,让它找到第一个能匹配 adsite-2.com 的一部分的条目。名单会先找到 adsite ,并确认它可以匹配 adsite-2.com 的一部分,因此返回该条目。Proxomitron接收到该条目后发现无法匹配,所以整个 URL 就无法被匹配。如果不改写整个匹配和名单,将 adsite-2 放在 adsite 的前面也可以正常过滤 www.adsite-2.com)
www.$LST(hosts)com
# # Host list # adsite. adsite-2.
另外小心使用 "*",它会一直匹配掉所有的字符。通常来说这不是我们所希望的,所以最好把 "*" 放在调用名单的匹配中...
www.$LST(hosts)*.com
结尾...
这就是所有关于匹配名单的信息。如果你读到了这里,我正式授予你 P.C.B.F.E. (Proxomitron Certified Blocklist (or Blockfile) Engineer)(Proxomitron 过滤名单(或过滤文件)工程师证书)。这可会使你的简历锦上添花的喔!
