扩展匹配命令
Previous Back to contents Next

除了匹配规则,Proxomitron 也支持特殊的匹配命令,有点像函数调用。这些扩展匹配命令能完成一些元字符很难或没法完成的任务。它们的基本格式是这样的...

$命令(参数1, 参数2, ...)

虽然命令都是以 "$" 开头,但 "$" 本身却没有特殊含义,通常不用 "\" 转义就可以匹配。唯一的例外是当 "$" 后面的文本和命令文本一样的时候。

最后一点:不是所有命令都可以用在任何地方的。一些函数只能用在匹配表达式部分,一些只能用在替换文本部分,一些两者皆可。同样的,一些命令只能在 header 过滤里工作,另一些则只能在网页过滤里工作。这些限制会在每个命令的描述里提到。


匹配命令资料

废话不多说了,以下就是一份完整的匹配命令及其参数和基本使用方法的列表。

快速跳转:点击以下链接跳转到相应命令:

$ADDLST $ADDLSTBOX $ALERT $ASK $AV $AVQ $CON $CONFIRM $DTM $ESC $FILE $FILTER $GET $IHDR $INEST $JUMP $KEYCHK $LOCK $LOG $LST $NEST $OHDR $RDIR $RESP $SET $SETPROXY $STOP $TST $TYPE $UESC $UNLOCK $URL $USEPROXY $WESC

$ALERT(消息文本)

限制: 匹配表达式或替换文本部分
过滤规则类型: 全部

$ALERT 和 JavaScript 的 alert() 函数差不多,它会显示一个包含消息文本的对话框。这在你调试过滤规则或需要网页为某些事情弹出提示的时候会很好用。消息文本并不只能是简单的文本,它可以是任何替换命令(像 \1\h)。

$CONFIRM(消息文本)

限制: 匹配表达式或替换文本部分
过滤规则类型: 全部

$CONFIRM 和 $ALERT 差不多,就是多了一对 "Yes" 和 "No" 的按钮。这可以用来在匹配表达式部分进行检测,"Yes" 代表匹配,"No" 代表不匹配。你可以用这个命令来控制过滤规则,让它根据用户的回答而做不同的事情。

$CONFIRM 里也可以使用各种替换命令

$ADDLST(过滤名单的名称, 需要添加的文本)

限制: 匹配表达式或替换文本部分
过滤规则类型: 全部

$ADDLST 可以用来往已经载入的任何过滤名单里添加一行新的文本。任何在文本里的替换命令都会被自动展开,这样当添加捕获到的 URL,主机名,或其他被过滤规则匹配的项目时就会很方便。不过提个醒,最好还是用 $WESC(...) 命令预先编码需要添加的文本,以免添加进名单的文本含有一些你不希望的匹配命令。例如...

$URL(http://\1)
$ADDLST(MyList, $WESC(\1))

可以确保 \1 捕获的文本里的任何通配符都被转化为安全的普通文本。

$ADDLSTBOX(过滤名单的名称, [对话框标题,] 需要添加的文本)

限制: 匹配表达式或替换文本部分
过滤规则类型: 全部

$ADDLSTBOX 也可以用来往已经载入的任何过滤名单里添加一行新的文本。不过它是通过调用 Proxomitron 的 "Add to blockfile" 对话框实现的。 这样用户可以有机会修改文本,或是取消添加。如果在匹配表达式部分调用该命令,当用户添加文本后,此命令会被匹配为 "true" ;而如果用户取消添加,此命令会被匹配为 "false"。对话框标题是可选参数,可以用来在对话框的标题栏显示你想要的文字。

$ASK(允许名单的名称, 屏蔽名单的名称, 提示文本, 需要添加的条目 [, 备用匹配])

限制: 匹配表达式部分
过滤规则类型: 全部

$ASK() 可以用来询问用户某页面上的某个项目是否需要被过滤。你必须在参数里指定一个 "允许" 名单和一个 "屏蔽" 名单用来记住用户的选择(名单可以被多个过滤规则共享)。"提示文本" 是你希望显示在对话框里的文本,任何在提示文本里的替换命令都会被自动展开。"需要添加的条目" 就是需要添加到名单里的项目。。。It will be matched against the sites URL (by default)。$ASK 命令只能在规则的匹配表达式部分使用,并且通常应该是最后一个检测项目。例如....

  Name="A foo filter"
  Active=TRUE
  URL="^$LST(AllowFoos)"
  Match="<foo\s*>&"
        "$ASK(AllowFoos, DenyFoos, You you want to Foo at...\n\h?, \h)"
  Replace="<NoFoosAllowed>"

这个规则仅仅是用 "\h" 把主机名插入 AllowFoos 或是 DenyFoos 名单里。即使不额外使用 $LOCK() 命令,$ASK 也不会向用户重复提示相同的项目。注意在 URL 匹配部分我们加入了一个限制,"禁止" 匹配允许名单里的条目。虽然没有这个限制这个名单也可以正常工作,但是如果某个 URL 已经在允许名单里了,我们就没必要在这个 URL 上浪费时间去匹配这个规则。

通常 $ASK 使用站点的 URL match against(类似规则本身的 URL 匹配部分),但其实我们也可以使用其他条目去匹配。$ASK 有另外一个可选参数 "备用匹配",在展开时会被用来 matched against "允许" 和 "屏蔽" 名单的条目。例如...

  Name="Filter applets by class"
  Active=TRUE
  Bounds="<applet\s*</applet>"
  Match="<applet*code=$AV(\1)*&"
        "$ASK(AllowApplet, DenyApplet,"
        "Do you you want to allow Java Applet\n[\1]?, \1, \1)"
  Replace="<AppletKilled>"

这条规则先匹配 applet 标签,把其所有属性并存进变量 \1,接着调用 $ASK 函数,并且 instead of the page's URL, \1's value is checked against both。

$ASK 命令有个现象可能会显得比较奇怪,那就是当用户选择 "No" 的时候会返回 "true",但当用户选择 "Yes" 的时候会返回 "false"。你可能觉得这前后颠倒了,但其实因为 "Yes" 的意思是我们希望此条目被过滤,这样做会让事情变得简单。

$AV(匹配文本)

限制: 匹配表达式部分
过滤规则类型: IN Headers, OUT Headers, 或网页过滤的匹配表达式部分

这是用来匹配元素的任何属性值的。它先分析并隔离元素属性值 - 智能检测有引号或没有引号的情况。接下来会用参数 "匹配文本" 去匹配元素的属性值。记住:包围元素属性值的引号不会被匹配。

例如,想要检测任何 alt 属性包含单词 "Gargalishous!" 时,你可以使用...

<img * alt=$AV(*gargalishous!*) *>

它可以匹配以下所有情况...

<img src="foo" alt="My is this trout ever Gargalishous!">
<img src="foo" alt='Gee your hair is Gargalishous! Is that bison flavor?'>
<img src="foo" alt=JustRawGargalishous! >

$AV 命令不会匹配引号,但仍然会消耗引号。这意味着如果你想要捕获包括引号的完整属性值,你可以使用例如...

<img * alt=($AV(\1))\2 *>

这里 \2 可以捕获包括引号的属性值,而 \1 仍然捕获不包括引号的属性值。例如原文本如下...

<img src="foo" alt="Move all Zig!">

\1 = Move all Zig!
\2 = "Move all Zig!"

但其实还有另一种方法 - 使用 $AVQ()

$AVQ(匹配文本)

限制: 匹配表达式部分
过滤规则类型: 全部

这条命令和 $AV(...) 一样,只不过它会匹配引号,在你只想要捕获变量值的时候会很有用。例如...

<img * alt=$AVQ(\1) * >

它会把任何img元素的 alt 值(包括引号)捕获进变量 \1.

$DTM(格式文本)

限制: 替换文本部分
过滤规则类型: 全部

$DTM 可以用来向替换文本中插入当前日期,时间,和连接数信息。它使用简单(区分大小写)格式符串来控制显示...

M = 月
D = 日
Y = 年
h = 十二小时制
H = 二十四小时制
m = 分
s = 秒
t = 毫秒
a = (am/pm)
w = 星期一~星期天的三个字母英文缩写(Mon,Tue,Wed,Thu,Fri,Sat,Sun).
I = 因特网格式UTC时间
c = 当前连接数

一些现成的时间格式:

T = H:m:s (小时:分:秒)
U = M/D/Y (美国方式,月/日/年)
E = D/M/Y (欧洲方式,日/月/年)
d = Y-M-D (数据库方式,年-月-日)

例如,想要输出 "年/月/日" 格式的当前日期,可以使用...

$DTM(Y/M/D)

想要以十二小时制显示当前时间,可以使用...

$DTM(h:m:s a)

想要同时显示上面两者...

$DTM(Y/M/D h:m:s a)

这在用来向网页插入日期,或在 $LOG 或其他类似命令里插入信息时很有用。

通过设置变量,可以让规则只在固定的时间匹配 (感谢 ScoJo :-)。 例如,想要写一个只在晚上9~10点生效的规则,你可以使用...

$SET(CHour=$DTM(H))$TST(CHour=[#19:20])

$KEYCHK(按键代码)

限制: 匹配表达式部分
过滤规则类型: 全部

$KEYCHK 命令可以用来在过滤规则里检测用户按键(例如,在用户按住特定键时跳过一个过滤或是让过滤有另一个动作)。这跟其他的匹配检测一样,也可以用在过滤规则的匹配表达式和 URL 匹配里。匹配完后,如果检测到对应按键已经被按下,KEYCHK 会返回 "matched"。大多数按键都可以被检测到,除了它们的 shift 值。一些特殊键则需要以 "^" 符号开头....

^C = Ctrl
^A = Alt
^S = Shift
^T = Tab
^F1 = F1
^F2 = F2
^32 = Space
^65 = "A"

按键代码是不区分大小写的,所以 "^c" 或 "^C" 都对应 "Ctrl" 键,也可以使用按键组合。例如...

$KEYCHK(^A^S) = Alt +Shift
$KEYCHK(^C^F6) = Ctrl + F6
$KEYCHK(^AG) = Alt + G
$KEYCHK(^C^A^S) = Ctrl + Alt + Shift

这条命令允许任何按键组合。如果你了解 Windows 的按键代码(0~255),你也可以使用其他特殊按键。例如 ^2 检测鼠标右键点击。

$FILE(文件名)

限制: 替换文本部分
过滤规则类型: 全部

$FILE 命令可以用来将任意文件的内容插入规则的替换文本部分。例如...

Match="(^(^<BODY))"
Replace="<script>$FILE(c:/mystuff/myscript.js)</script>"
        "$STOP()"

可以用来在网页的 <body> 标签前插入一段自定义的 Javascript。

注意: 由于 Proxomitron 使用反斜杠 "\" 作为转义字符,文件路径必须要使用斜杠 "c:/some/path/name" 或者转义过的反斜杠(即两个反斜杠)"c:\\some\\path\\name".

我们这里使用到了另一个小技巧 - 仔细看看匹配表达式部分的 (^(^...))。一个单独的 "(^...)" 可以用来表示一个否定匹配,那么 "(^(^...))" 这样的双否定匹配是做什么的?双重否定变成肯定,所以双否定匹配和一个普通匹配差不多。但是它有一个非常重要的特性 - 它不消耗任何字符。这意味着你可以匹配某些文本 (像是一个 <body> 标签) 但不消耗它。这样你不用在替换文本部分重新写上 <body> 标签,而且即使不用多重匹配,其他的规则也可以正常继续匹配 <body> 标签。

这个技巧还有另一个重要的特性 - 如果我们在这条规则中使用多重匹配,任何我们通过 $FILE 插入的文本以及我们所匹配的文本都会停留在 Proxomitron 的输入缓冲里。而使用双否定匹配的话,既不会使匹配的文本停留在输入缓冲,也能达到多重匹配的效果。但注意,由于双否定匹配不消耗任何字符,一定要在双否定规则的最后加上 $STOP(),以防止这个规则重复匹配!

$LOCK()

限制:
过滤规则类型: 全部

$LOCK 命令可以用来确保规则里的一组项目作为一个整体共同作用。同一时间只有一个规则可以被 "锁住",任何其他需要调用 $LOCK 的规则(即使是作用于同一时间载入的不同网页)也必须得等到这个规则完成后才能调用。大多数时候这个命令用来使规则与用户互动,像是询问把一个网页的地址放进 "允许" 还是 "屏蔽" 名单。例如...

(一些匹配代码)
& $LOCK()
(
  $URL(http://$LST(DenyList))|
  (^$URL(http://$LST(AllowList)))
  (^$CONFIRM(Allow Flash at:\n\h)
    $ADDLST(AllowList,\h)
    $STOP()
  )
  $ADDLST(DenyList,\h)
)

首先这个规则被锁住,这样直到这个规则作用完毕以前,任何其他规则都无法做同样的事情。接下来这条规则检查网站的 URL 是否已经存在于 "屏蔽" 名单里。如果是,则匹配成立;如果不是,规则会继续检查网站的 URL 是否存在于 "允许" 名单里。如果也不在 "允许" 名单里,规则会弹出提示框询问用户是否希望在此网页允许flash。根据用户做出的选择,规则会把网站的 主机名存入 "允许" 或 "屏蔽"列表,这样下次再浏览此网站时就不会提示了。

你可以看到这里发生了一系列的匹配,并且在匹配时确保没有其他页面使用相同的匹配是非常重要的。而 $LOCK 保证上面的一系列命令作为一个整体共同作用。不过记住这种匹配比较慢,所以在不必要的时候不要随意调用 $LOCK。在上面的例子里,正常的匹配代码会在被锁住部分作用前先匹配完成。

$UNLOCK()

限制:
过滤规则类型: 全部
$UNLOCK 和 $LOCK 相反,它会解锁以使下面正在排队等待调用 $LOCK 的规则顺利完成。当然,如果你什么都不做,在$LOCK 完成后,$UNLOCK 也会被自动调用。通常在你需要更早 "解锁" 的时候才会用到这个命令。

$LOG([!][RGBYVCWw]消息文本)

限制:
过滤规则类型: 全部

$LOG 可以用来在 Proxomitron 的日志窗口里添加一条消息记录。这可以用来 debug 或是给正在作用的规则添加更多信息。记住第一个字符比较特殊 - 它不显示在消息记录中,而是用来设置消息记录的颜色的。例如...

$LOG(RThis will be red)

这里是所有可以使用的颜色:

R=红色 W=White w=灰色 B=蓝色 G=绿色 Y=黄色 V=紫色 C=青色

记住这些字符都是区分大小写的。还有,为了显示特别重要的消息,你可以在颜色字符的前面加一个感叹号 "!"。这时如果该消息被显示,日志窗口会被强制打开...

$LOG(!R---This is Important---)

$LST(过滤名单名称)

限制:
过滤规则类型: 全部

这条命令可以用来在任何匹配表达式部分加入一个过滤名单。过滤名单的内容会被逐行读取到匹配成功。否则匹配会返回 "false"。

译注:由于proxomitron一旦在过滤文件里发现匹配项就会退出匹配,所以要注意过滤文件的内容唯一性。例如,如果在过滤文件里有两行按次序分别是: [^.]+.abc.com 和 www.abc.com,那么当访问 www.abc.com 时,只会匹配前者而不是两者都匹配或只匹配后者。如果一定要分别匹配这两个,需要把 www.abc.com, image.abc.com 等等都放在 [^.]+.abc.com 的前面。

$NEST(开始匹配, [中间匹配,] 结束匹配)

限制: 匹配表达式部分
过滤规则类型: 所有 (主要是网页过滤)

$NEST 命令可以用来在嵌套中查找与开始标签或字符相对应的结束标签或字符。例如,为了匹配嵌套的 <TABLE> 标签你可以使用...

$NEST(<table*>,</table>)

它会匹配以下文本中的红色部分...

...some HTML...
<table name="outer table">
  ...
  <table name="inner table">
    ...
  </table>
  ...
</table>
...some more HTML...

看到了没,即使这里面有个嵌套的 table,$NEST 仍然可以为 "outer table" 找到正确的结束标签。

$NEST 有一个可选参数 "中间匹配"。如果使用,整条命令会匹配一对包含 "中间匹配" 文本的标签。重要的是,这段文本 不会匹配开始或结束标签中的任何文本,而只会匹配标签对中的文本。同样是上面的那段 HTML 代码...

$NEST(<table*>,\1,</table>)

以上表达式中的 "\1" 只会匹配以下蓝色部分...

...some HTML...
<table name="outer table">
  ...
  <table name="inner table">
    ...
  </table>
  ...
</table>
...some more HTML...

$INEST(开始匹配, [中间匹配], 结束匹配)

限制: 匹配表达式部分
过滤规则类型: 全部 (主要是网页过滤)

$INEST ("内嵌套") 和 $NEST 的不同之处在于,$INEST 的开始和结束标签都在命令外面。换句话说,它假定你已经找到了标签并只对寻找标签的结尾感兴趣。仍然使用上面 $NEST 的例子...

<table name=$AV(*outer*) >$INEST(<table*>,</table>) </table>

会匹配如下文本的红色部分...

...some HTML...
<table name="outer table">
  ...
  <table name="inner table">
    ...
  </table>
  ...
</table>
...some more HTML...

用$INEST的优势是它很容易找到 特定的 开始标签(这里是 name 为 "outer" 的 table),而不是任何此类的开始标签。而用 $NEST 的话就很难做到这样,这是因为在 "开始匹配" 里的任何检测都必须返回 true,不仅仅是外部的嵌套 table,也包括里面的。

$SET(\# 或 \0-\9=变量值)
$SET(变量名=展开值)

限制: 匹配表达式或替换文本部分
过滤规则类型: 全部

$SET 命令可以做两件不同的事情。第一,可以用来把某个位置变量设置为一个特定的变量值,这个变量值可以是任何文本,包括其他变量。第一个参数是一个位置变量 \0 到 \9 或替换堆栈变量 \# ("\" 可以被省略)。接下来是一个等号后面跟着变量值。例如...

\1 等于 "foobar": $SET(1=foobar)

使变量 \1 输出 \2 的内容: $SET(1=Two is \2)

通过把 $SET 命令嵌入匹配表达式,你可以选择在某种特定情况下才设置变量值,相当于 if/then/else 的效果...

Match: name=(
   one $SET(0=Naoko) | 
   two $SET(0=Atsuko) |
   three $SET(0=Michie) | 
   $SET(0=Default))
Replace: "\0 Matched"

会产生如下结果...

if name=one then "Naoko Matched"
if name=two then "Atsuko Matched"
if name=three then "Michie Matched"
else "Default matched"

不过位置变量有一些限制:变量值在被替换文本部分调用前都不会被 "展开"。这意味着,如果 \1 的值是 "fish",然后你用 SET 命令: $SET(\2=\1 food),这时 \2 并不会被设置为 "fish food",而是 literally 被设置为 "\1 food"。虽然当 \2 在替换文本部分被调用时仍然会被展开为 "fish food",但这意味着你无法把某个位置变量设置为包含它本身的一段新变量,像是 $SET(\1=something and \1)。

虽然如此,但别灰心。$SET 还可以做第件事 - 这是在 Naoko 4.5 Proxomitron 被引入的概念:"全局变量"。全局变量有变量名,并且在网页过滤或 header 过滤里都可以使用。一旦被创建,全局变量会一直存在直到请求结束,并且在这期间可以被任何过滤规则调用。

全局变量的名称由26个字母和10个数字组成 (a-z 和 0-9),但必须以字母开始。要创建一个全局变量,可以...

$SET(VarName=some value)
$SET(Chiyo=tensai)
$SET(Osaka02=atamaga warui)

和位置变量一样,全局变量里也可以包含替换命令。但是,和位置变量不同的是,在创建时全局变量就会自动展开。因此,就算规则的某部分不匹配,你仍然可在不匹配的部分之前设置一个全局变量。另外你还可以把全局变量设置为它本身(参见 $GET 命令)。

需要清除全局变量时,像这样调用 $SET 命令即可...

$SET(VarName=)

如果确定某个全局变量已经不需要使用了,最好就用这条语句清除,因为这样可以释放它所占用的内存空间并在程序查找其他变量时加快速度。

$GET(变量名)

限制: 替换文本部分
过滤规则类型: 全部

$GET 命令可以用在任何替换文本部分,用来插入之前用 $SET 命令创建的一个全局变量。它甚至可以在另一个 $SET 命令里,例如...

Match: <a * href=$AVQ(\1)$SET(LinkURL=>>\1<<) *>
Replace: "The linked URL was: $GET(LinkURL)"

和 "\1" 这样的位置变量不同,只要是同一个请求,全局变量就会一直存在并可以被访问。因此,你完全可以用一个规则捕获一些文本,再在另一个规则里插入它。你也可以结合使用 $SET 和 $SET 来不断给一个变量加入内容。例如...

$SET(foo=$GET(foo) more stuff) ...把内容加进全局变量 "foo" 的结尾
$SET(foo=more stuff $GET(foo)) ...把内容加进全局变量 "foo" 的开头
$SET(foo=$GET(foo) \1)         ...把位置变量 "\1" 里的内容加进全局变量 "foo" 的结尾
$SET(foo=$GET(foo)$GET(bar))   ...把全局变量 "bar" 里的内容加进全局变量 "foo" 的结尾
注意 $GET 只能用于 有名字的 变量,而 不能 用于位置变量。也就是说,"$GET(\1)" 是错误的。要取得位置变量,只要用 "\1" 即可。

$TST(\# or \0-\9=匹配表达式)
$TST(变量名=匹配表达式)
$TST(变量名 或 \# 或 \0-\9)

限制: 匹配表达式或替换文本部分
过滤规则类型: 全部

$TST 命令可以用来测试一个全局变量或位置变量的内容是否匹配一个特定的值。例如...

$TST(Chiyo=*(tensai|short)*)

当变量 "Chiyo" 包含单词 "tensai" 或 "short" 时会返回 "true"。又例如...

Match: <img * height=$AV(\1) * > $TST(\1=[#10-40])

当 "\1" 包含一个10到40之间的数字时会返回 "true"。

另外,为了让 $TST 匹配成功,你必须匹配值的 总长度。如果只想匹配值的部分文本,务必像第一个例子那样在开始和结尾都加上星号 "*"。

$TST 有个技巧 - 如果不写任何匹配表达式,它表示将一个变量和一段文本相比较。这可以用来为一个未知的开始标签寻找它的结束标签。例如...

Match: <([a-z]+)\1 * </$TST(\1)>

这只会匹配 "<AnyTag> stuff </AnyTag>", 但不会匹配 "<AnyTag> stuff </ADifferentTag>". Note that except for case the match must be exact - anything in the variable's value is just treated as plain text and not wildcards.变量里的任何符号都会被作为纯文本对待而不是通配符。

加速技巧: 由于包含一个变量查找的过程,$TST 会比普通的匹配慢一点。如果可能的话,尽量还是把 $TST() 放在普通匹配的 后面 来检查。另外注意尽量不要在它前面直接使用 "*" 这样的通配符。例如...

慢速: <a *$TST(foo=*bar*)</a>
稍快: <a *</a>$TST(foo=*bar*)

这样可以显著减少 $TST 的执行次数。

$CON:(x,y[,z])

限制: 匹配表达式部分
过滤规则类型: 全部

只有当前的连接数为每 'y' 个的第 'x' 个 或 每 'y' 组的第 'x' 组(每 'z' 个为一组)时,CON 才会返回 "true"。它可以用来基于当前连接数循环赋值。下面的例子可以循环给 \0 赋值...

($CON(1,3) $SET(0=Value one of three)|
$CON(2,3) $SET(0=Value two of three)|
$CON(3,3) $SET(0=Value three of three))

可选参数 'z' 可以延迟为每 "z" 个才递进一次。

(译注:当前的连接数可以在日志窗口里看到,是 "+++RESP ...+++" 和 "+++GET ...+++" 的数字部分。该数字表示 Proxomitron 最近一次启动开始一共连接了多少个文件。)

$IHDR(header名:匹配表达式)
$OHDR(header名:匹配表达式)

限制: 匹配表达式或替换文本部分
过滤规则类型: 全部

$OHDR 和 $IHDR 可以用来分别检查任何 Out 或 In 的 HTTP header。注意 header 名不可以使用通配符,但匹配表达式可以使用。当指定名称的 header 的值符合 "匹配表达式" 部分时,这两个命令会返回 "true"。$OHDR 用来检查 out header,$IHDR 用来检查 in header。例如,以下规则在 header 的 "Referer" 部分包含 'microsoft.com' 时会匹配...

$OHDR(Referer:*.microsoft.com)

你也可以在网页过滤部分用它们来匹配特定的 header 值返回 true 的情况,或是将 header 值捕获进变量并用在替换文本部分。你也可以在 header 过滤部分,用这两个命令来检查复数的 header 值。

$RESP(匹配)

限制: 匹配表达式或替换文本部分
过滤规则类型: 全部

$RESP 命令可以用来匹配或捕获服务器返回的 HTTP 状态码。(参见消息窗口)。通常它们是 "200 OK" 或 "404 Not Found" 之类的值。

匹配不包括返回的 "HTTP/x.x" 部分。它只包括3个数字的状态码及其之后的描述文本。例如,匹配服务器重定向时,可以使用 "$RESP(302*)"。$RESP 也可以用来捕获信息并存入消息文件。

$URL(匹配值)

限制: 匹配表达式或替换文本部分
过滤规则类型: 全部

$URL 可以用来在规则的匹配表达式部分检测 URL。通常规则的 URL 匹配可以检测这个值,但是这个命令可以在文本匹配里限制特定的URL,或是将URL的一部分捕获进变量。下面的例子可以捕获URL的路径...

$URL(http://www.somehost.com/\1)

注意:由于现在 Proxomitron 不止处理 HTTP 一种协议,$URL 命令的检测也包含 URL 的协议(例如 "http://")。这跟旧版本有所不同,所以你可能需要调整旧的过滤规则。

$TYPE(代码)

限制: 匹配表达式
过滤规则类型: 网页过滤

检测 Content Type 的命令。这个命令可以用来限制规则只作用于特定的文件(例如只作用于 JS 文件)。"代码" 可以是下列之一...

htm- 网页
css- CSS
js- JS
vbs- VBS
oth- 其他

这在网页过滤的 URL 匹配部分很有用。在 header 规则里, 它的值是未定义的(因为在 header 里 Content-Type 还不能确定)。记住这只是个快速简单的检测。如果需要检测更复杂的 Content-Type,可以使用 "$IHDR(Content-Type: ... )",其中 "..." 是任何匹配表达式,包括通配符。

$RDIR(http://some.url.com/)

限制: 匹配表达式或替换文本部分
规则过滤类型: IN 或 OUT header 规则

$RDIR (重定向) 命令可以用来将 URL 悄悄地重定向至一个新的地址。你也可以使用 URL 命令语法 "http://file//文件路径" 重定向至本地文件。新的 URL 必须是 Proxomitron 能够解析的类型 (http 或 https)。

$RDIR 和 $JUMP (见下) 命令都只能用在 header 规则里。非常重要的一点,Out header 的重定向会在与远程服务器取得联系前就发生,但如果用在 in header 的规则里,则必须先于远程服务器取得联系才会重定向。这两个命令对网页过滤都没有作用,因为网页过滤 作用时,原先的网页已经开始载入浏览器了。这种情况下你可以使用 Javascript 来跳转到新的地址...

<script> document.location="http://some.new.url/"; </script>

$JUMP(http://some.url.com/)

限制: 匹配表达式或替换文本部分
过滤规则类型: IN 或 OUT header 过滤

$JUMP 命令和 $RDIR 命令差不多,都是用来重定向到一个新的地址。但是 $JUMP 是直接告诉浏览器跳转到新地址,而不是悄悄地重定向到新的地址。这比较接近用 "meta" 的刷新功能或是在 javascript 里设置 document.location($JUMP 实际上向浏览器发送一个 302 重定向命令)。

使用 $JUMP 的情况下,浏览器知道重定向,并且地址栏的地址会被刷新为新的地址。如果需要重定向整个页面的话,用 $JUMP 就很好。 $RDIR 更适合用来隐秘地重定向图片或java程序之类的页面内容。

$STOP()

限制: 匹配表达式或替换文本部分
过滤规则类型: 全部

$STOP 是一个非常简单的命令。如果在规则的匹配表达式或替换文本部分遇到 $STOP,在本次连接或剩下的页面中该规则会被关闭。在 $STOP 之前的匹配还是可以完成的,但是一旦完成,之后对于该连接,该规则都不会再有任何匹配。

这很适合那些你只希望匹配一次的规则,尤其是那些在网页中插入一些东西的规则。例如,如果你想在 <BODY> 标签的后面插入一小段 javascript,你可以使用...

Match:<body\s \1>
Replace:<body \1>
<script>my script</script>
$STOP( )

这不仅保证了 javascript 只会被插入一次,更由于 Proxomitron 不用再在本页面浪费时间检测这个规则,会使执行速度略微加快。另外注意到即使整个规则不匹配,只要在匹配过程中匹配到了 $STOP 部分,$STOP 就会被执行。

$FILTER(True 或 False)

限制: 匹配表达式或替换文本部分
过滤规则类型: IN 或 OUT header 规则

$FILTER 命令可以用来根据请求的类型强制过滤或不过滤该请求。通常只有特定的类型会被过滤(像是 text/html, text/css, image/gif 等等)。$FILTER 可以用在 Header 规则的匹配表达式或替换文本部分,并接收 "true" 或 "false" 作为参数。如果是 "true",不管什么类型的请求都会被所有网页过滤检查一遍。小心这只对基于文本的网页内容有效。

在 header 规则里用 $FILTER 命令配合 URL 匹配,可以避免 "固定" 特定的 GIF 动画。

例如...

Out = "True"
Key="URL: Don't freeze this gif"
URL="www.somewhere.com/animate_me.gif"
Replace="$FILTER(False)"

$USEPROXY(True 或 False)

限制: 匹配表达式或替换文本部分
过滤规则类型: OUT header 过滤

$USEPROXY 命令也是接收 "true" 或 "false" 作为参数并无视 Proxomitron 的 "Use remote proxy" 选项。它可以确保在某个特定动作中强制启用或禁用代理。

这个命令只有在 Out header 过滤的匹配表达式或替换文本部分才有作用。这是由于在建立连接前就必须决定该连接代理设置。

$SETPROXY(代理服务器名[:端口])

限制: 匹配表达式或替换文本部分
过滤规则类型: OUT header 过滤

$SETPROXY 命令可以强制某个连接使用特定的代理。它无视 "Use remote proxy" 选项和代理选择器里的当前代理设置。它可以用来确保在特定条件下或特定 URL 下使用特定的代理。

需要设置的代理必须已经存在于代理选择器名单里的条目。这个命令只是简单地从名单中寻找代理并使用它。参数通常只需要代理服务器名就可以了 - Proxomitron 会自动使用第一个在名单中找到的代理。但是不可以使用通配符。

和上个命令一样,这个命令只能在 out header 过滤的匹配表达式或替换文本部分调用。

$UESC(被编码文本)

限制: 替换文本部分
过滤规则类型: 全部

$UESC 命令和 javascript 的 uescape() 命令差不多,都是用来将被 escape 编码过的字符解码成它们的 ASCII 码形式。这在解码内嵌在网页里的 URL 时很有用(很多站点用来跟踪点击的方式)。一般像 ":" 和 "/" 的字符都会被 escape 编码为它们的 hex 码 ("%3A" 和 "%2F"),使真实链接难以过滤。

$UESC 可以用在规则的替换文本部分,并且参数可以是任何替换文本(像是 \1 变量)。它可以解码绝大多数被 escape 编码过的字符,但空格和无法显示的 ASCII 码都会保持编码状态。

$ESC(任何文本)

限制: 替换文本部分
过滤规则类型: 全部

$ESC 命令和 $UESC 相反,而和 javscript 的 escape() 命令相似,用来将非字母和数字的字符编码为 hex 码(%xx 形式),使它们可以作为URL文本被浏览器处理。

$ESC 可以用在规则的替换文本部分,并且参数可以是任何有效的替换文本(像是 \1 变量)。

$WESC(任何文本)

限制: 替换文本部分
过滤规则类型: 全部

$WESC 命令虽然和 $ESC 差不多,但它是用来编码所有 Proxomitron 可使用的通配符或匹配命令的,像是 *?。这在往过滤名单里插入被捕获的文本时很有用。

$WESC 可以用在规则的替换文本部分,或是作为参数的一部分存在于一些在匹配表达式部分需要展开参数的命令(像是 $ADDLST 和 $ADDLSTBOX).。


返回目录