https:// とりあえず似た物は纏める方向で
Replace = "a$CONFIRM(b?)b$CONFIRM(c?)c" まず「a」を置換する。 "b?"というダイアログ出現。 | ├─「いいえ」を選択するとそこで置換終了。 | (二回目のダイアログは出ない) └─「はい」を選択すると「b」を置換する。 "c?"というダイアログ出現。 | ├─「いいえ」を選択するとそこで置換終了。 | └─「はい」を選択すると「c」を置換する。
... |
使用可能な場所 : URL Match を除く検索表現、置換テキスト
引数は不要
$STOP()を使用すると、そのフィルター(cfgファイル全体ではない)が、その通信で、二度と使用されなくなる。高速化・誤爆の回避に使用する。
置換後ストップ、マッチしなければストップのように使う。
置換部分に入れる場合で、置換テキストにおける条件分岐が存在しない場合、入れ忘れないように、最初に入れておいた方が良い。
$STOP(all)、$STOP(*) の様にして、全てのフィルタを使用しないようにするなどという事は出来ない。
使用可能な場所 : HTTP-Header の検索表現・置換テキスト
booleanは、true か false のどちらか
Webページフィルタを実行するかしないかのスイッチ
スイッチはその接続でのみ有効
※4.5の場合、$FILTER(true) を使用しても、Webページフィルタが有効にならない事がある → 各バージョンの違い#v4-5june6-bug
使用可能な場所 : 置換テキスト
現在の接続を切断する。
HTTP-Header で使用された場合、./html/killed.html の内容(デフォルトは空白ページ)に書き換えられる。
また画像の場合 ./html/killed.gif (デフォルトは小さい透過画像)に置換される。
どちらも、Location: で変更されるのではなく、透過的に置換される。
空のデータに置換したい場合は以下のような方法もある。
Patterns で使用された場合、\k が出た所までブラウザに送信され、残りは送信されない。また、接続も切断されるので、通信の節約にもなる。
使用可能な場所 : 検索表現・置換テキスト
list_nameは直接記述する必要がある($SET(0=listname)$ADDLST(\0, value) というのは期待通りに動作しない)
valueは置換テキスト扱い
list_name が Block List に登録されている場合、そのリストに value + \r\n を追記する。
登録されていない場合メモリ上のリストに value が追記される。これは再起動すると消滅する。
置換テキストにおける条件分岐はなく、常に true を返す。
$ADDLSTBOX()も、確認・報告系として使える
使用可能な場所 : 検索表現・置換テキスト
textは置換テキスト扱い
textがログウインドウに表示される。
text中の\t\r\nは無視される \xは使用可能
頭の一文字は特別で、文字の色として扱われる。
例えば、$LOG(Rtext) で、 text と表示される。
B = Blue
C = Cyan 実際はaqua
G = Green 実際はlime HTTPヘッダ(out)情報と、POSTデータサイズ情報の色
R = Red
V = Violet 実際はfuchsia マッチしたHTMLフィルタ情報の色
Y = Yellow HTTPヘッダ(in)情報の色
w = gray 実際は#b4b4b4 ポストされたデータ情報と、その他の情報の色
これ以外の文字の場合、白文字になる ローカルファイルのリクエスト情報と、$JUMP,$RDIRの色
※大文字小文字を区別する
また、4.5では、頭に「!」を置くと、ログウインドウが強制的に表示される。
例:$LOG(!Rtext)
使用可能な場所 : 置換テキスト
any textは置換テキスト扱い
any text を1バイトごとに%xx(xxは16進数2桁)に変換する。 ただし、以下の文字は除外されそのまま返される。
* + - . / : @ _ 0-9 A-Z a-z 0x00
1バイトごとの検査であるので、例えば Shift_JIS における ヌ ( 0x83 0x6B ) は %83k を返す。
使用可能な場所 : 置換テキスト
any textは置換テキスト扱い
any text のうち、%xx(xxは16進数2桁)を元の文字に変換する。 対象となるのは%21-%7Eであり、それ以外の文字はそのまま返される。 完全には$ESC()の逆関数になっていない。
使用可能な場所 : 置換テキスト
any textは置換テキスト扱い
any text のうち、以下の文字の直前に \ ( 0x5C ) を付加して返す。
"(0x22) &(0x26) '(0x27) ((0x28) )(0x29) *(0x2A) +(0x2B) ?(0x3F) [(0x5B) \(0x5C) ](0x5D) |(0x7C)
1バイトごとの検査であるので、例えば Shift_JIS における ゼゾ ( 0x83 0x5B 0x83 0x5D ) は ソ[ソ] ( 0x83 0x5C 0x5B 0x83 0x5C 0x5D ) を返す。
これを利用したのが以下のようなフィルタ。
[Patterns] Name = "Shift_JIS dameji escaper (test only)" Active = FALSE Limit = 20000 Match = "\1" Replace = "$WESC(\1)"
検索表現や置換テキストにおいて日本語を使いたい場合に、 このフィルタのTESTモードでテストをすれば良い。 Shift_JISだと2バイト目が [ , \ , ] , | ( 0x5B , 0x5C , 0x5D , 0x7C ) である場合があり、それが原因でフィルタが動作しないことがあるがそれを防ぐ事が出来る。 ただし対象はShift_JISのみであり、フィルタエディタ部分を日本語使用可能にしている必要がある。
使用可能な場所 : 検索表現
matchは検索表現扱い
HTMLタグの属性値(Attribute's Value)にマッチするように作られたコマンド。
$AV(*) という表現は "*'|\w に等しい。つまり、
にマッチする。ここまでは$AVQ()と共通である。
($AV(\1))\2 という表現で、\1にはクォートを含まない属性値、\2にはクォートを含む属性値が格納される。ただし、属性値の囲みが " なのか ' なのかもしくは何も無いのかを判別するのは困難であり、その必要がある場合は$AVQ()を使うと良い。
$AV()、$AVQ()共に属性値内の\によるエスケープを考慮するので非常に使い勝手は良いが、どちらのコマンドも属性値に日本語(JIS や Shift_JIS の文字)が含まれる場合に誤マッチを引き起こす事があるので注意が必要である。
Bounds = "<img\s*>" Match = "*\salt=$AV(\1)*"
このような表現において\1にはalt属性の値が格納されるわけであるが、もし
<img alt="機能" src="aaa.jpg">
このような(Shift_JISの)文字列が与えられた場合、\1に格納されるのは「機能" src=」である。「能」の2バイト目が \ (0x5C) に等しいため、日本語を理解できないproxomitronには
<img alt="□□□\" src="aaa.jpg">
このように見えてしまうからである。
解決策は時と場合により、この場合はalt値内にクォートの入れ子がありえないと見切りをつければ以下のような書き換えで対応できる。
Bounds = "<img\s*>" Match = "*\salt=(\"\1\"|'\1'|(\w)\1)*"
$AV()、$AVQ() は前方一致ではないため、属性値は指定したパターン( $AV(match) における match )により 末尾の文字まで全て消費(マッチ)する必要がある。 もし属性値の末尾部分が消費されず残ってしまった場合、不一致として評価される。
パターンの末尾部分がグループで候補が複数の場合は、 属性値を全て消費してくれないケースが生じるので注意が必要である。
JavaScript内に記述されたHTMLタグ(文字列リテラル中で " がエスケープされたもの)にマッチさせる場合は以下のバグに注意。
属性値が \" で囲まれている場合に起きるバグ。 テキスト: <test a=\"1\" b=2> Match欄 : a=$AV(\0) → 「\"1\"」がマッチ。 Match欄 : a=$AV(\0["]) → 「合致なし」
このように、$AV()内の最後に ["] や \" を置くとマッチしなくなる。 $AVQ()でも同じ。( 4.5June338で確認 )
$AV(*) は以下の表現と同じ文字列にマッチする。
(["'])\9 (\\\\|\\$TST(\9)|?)++ $TST(\9)(^[!-=?-%FF]) | [!-=?-%FF]+{1,*}
使用可能な場所 : 検索表現
matchは検索表現扱い
$AVとほとんど同様のコマンドなのでそちらを参照のこと。
唯一の違いとして、($AVQ(\1))\2 という表現では\1、\2共にクォートを含む属性値が格納される。よって、
$AVQ((\"|'|)*)
という表現をベースに属性値の囲みによって処理を振り分けられる。
start match、inner matchでは {x,y} の形での繰り返し回数指定が使えない。
{x} の形は動く。 end matchではどちらも動く。
例、テキスト "abc" でテストした場合。 $NEST(a,b,c) → マッチ $NEST(a+{1},b,c) → マッチ $NEST(a+{1,1},b,c) → 『合致なし』 $NEST(a+{1,*},b,c) → 『合致なし』 $NEST(a,b+{1},c) → マッチ $NEST(a,b+{1,*},c) → 『合致なし』 $NEST(a,b,c+{1,*}) → マッチ
start match、end matchは外側と内側の両方にマッチするものでなければならないが、外側と内側で属性等が異なる場合で、 その属性等も検索表現に含めたい時は、次項の$INEST()か、肯定先読みを使う。
例: <div id="ad"><div>~</div></div> に外側のid属性を指定してマッチさせたい場合 (^(^<div id=$AV(ad)))$NEST(<div,</div>)
※ 先読みで属性のマッチを行い、$NEST()のstart matchは最低限にすることで、内外の属性の差異に関わらず入れ子を正しく認識できる。
[Patterns] Name = "TEST: $NEST(<div>,</div>) text=<div>'</div>'" Active = FALSE Limit = 256 Match = "$NEST(<div>,</div>)" Replace = "-"
検索対象 | 処理後 | |
---|---|---|
1 | <div>a</div>a | -a |
2 | <div>"</div>" | <div>"</div>" |
3 | <div>'</div>' | <div>'</div>' |
4 | <div>`</div>` | -` |
5 | <div>''</div>' | -' |
6 | <div>'''</div>' | <div>'''</div>' |
7 | <div>I'm Proxomitron</div>' | <div>I'm Proxomitron</div>' |
8 | <div>"I'm Proxomitron"</div>' | -' |
>$NEST(<a\s,</a>) は <a\s*</a> よりも高速に動作する、という事です。 これ、\sの直後に*が来てるから後者が遅いだけじゃないか? $NEST(<a(\s*|)>,</a>) と <a(\s*|)>*</a> 検索対象=「<a hoge>url</a>aaaaaaaaaaaaaaaaaaaaaaaaa」を100個並べた物 だと逆転する。どっちにしろ誤差の範囲内だが。
end match は「$INEST()コマンドの後ろに続く検索表現」に前方一致でマッチする検索表現でなければ機能せず、
『合致なし』となる。
※ ここでは$INEST()の動作条件のみに焦点を絞って書いてます。$INEST()の正しい使い方は日本語訳ヘルプをご覧下さい。
× <table>$INEST(<a\s*>,</a>)</table> → "</a>" という検索表現は "</table>" にはマッチしない。 ○ <table>$INEST(<tab>,</tab*>)</table> → "</tab*>" という検索表現は "</table>" にマッチする。
使用可能な場所 : [HTTP Headers]の検索表現・置換テキスト(URL、Match、Replace全て)
url は置換テキスト扱い。http://host/path/の様な完全な物か、/から始まる相対パス以外は使用出来ない(../~等の相対パスは\uに置き換えられてしまう)。
Proxomitronに接続して来たものに、Location:ヘッダを返して、指定したURLに移動させようとする。
(通常一般的なブラウザは、Location:ヘッダを受け取った場合、自動でそのURLに新しく接続する=別の接続になる)
↓実際に返すヘッダ HTTP/1.1 302 Redirect Content-Length: 0 Connection: close Location: url
※Inで使用し、元々のサイトが発見出来なかった場合は、エラー画面が出て、移動しない。
※http://localhost/ だと、Outでのみ有効になる。
hostsファイルを弄って、localhostt等に変更してみると、Inも有効。
また、localhost:80の様にポートを付けるとInも有効になることから、localhost/~の場合だけInが無効になる様子。
IE6の場合、$JUMP(file://C:/a.txt) の様に file:// を使うとローカルのファイルを直接参照可能(この場合、ブラウザがキャッシュしない為高速)
https: + out で使用すると、正常に移動しないことがあるので注意?
使用可能な場所 : [HTTP Headers]の検索表現・置換テキスト(URL、Match、Replace全て)
url は置換テキスト扱い。http://host/path/の様な完全な物以外は使用出来ない(/から始まる相対パスはエラーになり、../~等の相対パスは\uに置き換えられてしまう)
指定したURLに移動する。 ReDIRect
$RDIR()で移動後、再度$RDIR()を使用して他のアドレスに移動しようとしても、それは処理されない。
※Inで使用し、元々のサイトが発見出来なかった場合は、エラー画面が出て、移動しない。
※http://localhost/ だと、Outでのみ有効になる。
hostsファイルを弄って、localhostt等に変更してみると、Inも有効。
また、localhost:80の様にポートを付けるとInも有効になることから、localhost/~の場合だけInが無効になる様子。
$RDIR(file://C:/a.txt) の様に file:// を使ってもローカルのファイルは参照不能 URLコマンドのfile//を使うしかない(この場合ブラウザにキャッシュされる)
https: + out で使用すると、正常に移動しないことがあるので注意?
[HTTP headers] In = TRUE Out = TRUE Key = "URL: TEST $RDIR + $ALERT (both)" Match = "http://prx.dip.jp/&\0&$ALERT(before RDIR\r\nURL: = \0\r\n\\u = \u\r\n\\h = \h\r\n\\p = \p\r\n\\q = \q\r\n\\a = \a)$RDIR(http://prx.dip.jp/wiki/?qstr#anchor)$ALERT(after RDIR\r\nURL: = \0\r\n\\u = \u\r\n\\h = \h\r\n\\p = \p\r\n\\q = \q\r\n\\a = \a)"
telnet localhost 8080 GET http://prx.dip.jp/test/?qqq#aaa HTTP/1.0
未検証事項
... |
変数名にはローカル変数の 0~9、# が使用可能。 更に 4.5beta 以上ではグローバル変数も使用可能。
検証求む:フィルターはマッチしているのに代入されないことがあるらしい。
[バグ] 最長一致状態のローカル変数の直後に、同じ変数を$SET()で使用すると、ローカル変数の値が 0xHH になってしまう。
[Patterns] Name = "TEST1: \1$SET(1=hoge) text=abc" Limit = 256 Match = "\1$SET(1=hoge)" Replace = "[$ESC(\1)]" Name = "TEST2: \1b$SET(1=hoge) text=abc" Limit = 256 Match = "\1b$SET(1=hoge)" Replace = "[$ESC(\1)]" [結果] TEST1 4.5may以上: [%0A] 4.3, 4.4: [abc] TEST2 4.5may以上: [hoge]c 4.3, 4.4: [a]c ローカル変数にセットされるおかしな値は、$SETでセットした文字列の長さ(と内容)によって決まる 1Byteなら 0x07 2Byteなら 0x08 3Byteなら 0x09 4Byteなら 0x0A ・・・ 35Byteなら 0x29 = ) 36Byteなら 0x2A = * 37Byteなら 0x2B = + ・・・ 120Byteなら 0x7E = ~ 121Byteなら 0x7F 122Byteなら 0x80 ・・・ 240Byteなら 0xF6 248Byteなら 0xFE 249Byteなら 0xFF 250Byteで空(0x00ではない) 251Byteで 0x01 0x01 0xFB (3Byte) 252Byteで 0x02 0x01 0xFC 253Byteで 0x03 0x01 0xFD ・・・ 256Byteで 0x06 0x01 (2Byte) 257Byteで 0x07 0x01 0x01 0x01 の後にセットしたもの全て (4+257Byte) 258Byteで 0x08 0x01 0x02 0x01 の後にセットしたもの全て 259Byteで 0x09 0x01 0x03 0x01 の後にセットしたもの全て ・・・
参考:ASCIIコード表 http://www9.plala.or.jp/sgwr-t/c_sub/ascii.html
4.5beta から追加された機能
4.5beta から追加された機能
Match で取り込んだ変数を同じ Match で使いたいなどという場合、以下のような表現になる。(重複単語の削除) Match = "\s(\w+{1,*})\0\s$TST(\0)(^(^\s))" Replace = "\0"
(バグ) 『 $SET(\0=abc)$TST(\0) 』などの「$SET() + $TST() + ローカル変数」の組合わせは機能せず [合致なし] になる。
テスト用文字列 = "hogehoge" ・ "$SET + $TST + ローカル変数" $SET(\0=hogehoge)$TST(\0) → "[合致なし]" ・ "$SET + $TST + グローバル変数" $SET(N=hogehoge)$TST(N) → マッチ ・ "()\0 + $TST + ローカル変数" (hoge)\0$TST(\0) → マッチ ・ "()\0 + $SET + $TST + ローカル変数" (hoge)\0$SET(\0=hoge)$TST(\0) → "[合致なし]" ・ "$SET + ()\0 + $TST + ローカル変数" $SET(\0=hoge)(hoge)\0$TST(\0) → マッチ ※ (hoge)\0 で代入し直しているのでマッチする。
2024/9/29 追記(posted by oramu)
$TST内で変数とのMatchを行いたい場合は$TST(変数)を使う。 つまり、たとえば\0と\1のMatchを試行したい場合
・ $TST(\0=$TST(\1))
とする。
また、TST( 変数名 [= match] ) での [= match]部分は通常のテキストマッチングが行われる。つまり変数の格納内容に対してテキストマッチングされるので
・ $TST(\0=$LST(NG List)) → \0の内容がブロックリスト[NG List]にマッチするか(あるかどうか)テストされる。 ・ $TST(\0=hoge\1) → \0の内容が"hoge"で始まる文字列であれば、そこから後ろ(前方)の文字列を\1に格納する(文字列の切り出しが可能)。 ・ $TST(\0=hoge\1hoge) → \0の内容が"hoge"で始まり"hoge"で終わる文字列であれば、その間の文字列を\1に格納する。
など、さらに複雑なマッチングも可能。
($TST( 変数名 [= match] )[trueであるときの動作] |[falseであるときの動作]) とすることで IF(評価式) ~ ELSE ・・・ 構文が可能。
使用可能な場所 : 検索表現・置換テキスト
matching valueは検索表現扱い。前方一致。
プロトコルを含んだURLのチェック。
$URL(yahoo.co.jp/) × マッチする事はありえない $URL(http://yahoo.co.jp/) 〇 $URL([^/]+//yahoo.co.jp/) 〇
使用可能な場所 : Incoming Header FilterとPatternsの検索表現・置換テキスト
header-name はリクエストヘッダ名完全一致
(大文字小文字は問わず)。コマンド等使用不可
matching は検索表現扱い。前方一致。
リクエストヘッダの値のチェック。
Webページフィルタで利用する場合、ヘッダフィルタで置換された後のヘッダが出力される。 ヘッダフィルタでどうなるかは未検証。 $IHDR()も同じ。
使用可能な場所 : Patternsの検索表現・置換テキスト
header-name はレスポンスヘッダ名完全一致
(大文字小文字は問わず)。コマンド等使用不可
matching は検索表現扱い。前方一致。
レスポンスヘッダの値のチェック。
OUT中に$IHDR()を使用した場合、当然空 とも限らない
→ out 時に $IHDR() を使用する = $OHDR() と間違えたんだろうということで、Proxomitron が $OHDR() として処理する $OHDR() でも空だった場合は、空を返す (4.3, 4.4, 4.5m, 4.5j, 4.5j338, 4.5j+6 で確認)
以下例 http://prx.dip.jp/test/filtertest/nph-test.cgi で試してください
[HTTP headers] In = FALSE Out = TRUE Key = "Content-Type: test $ALERT($[OI]HDR(Content-Type: )) 1/2 (out)" URL = "prx.dip.jp/test/filtertest/" Replace = "test" In = TRUE Out = TRUE Key = "URL: test $ALERT($[OI]HDR(Content-Type: )) 2/2 (both)" URL = "prx.dip.jp/test/filtertest/" Match = "($OHDR(Content-Type: \0)|)($IHDR(Content-Type: \1)|)" Replace = "$ALERT(out = \0\r\nin = \1)"
out時 out = test in = test in時 out = test in = text/html; charset=Shift_JIS
ヘッダフィルタの「URL のマッチ (URL)」は、リクエスト(out)時に一度だけ処理される。
そのため、$IHDR() を、ヘッダフィルタの「URL のマッチ (URL)」で使った場合、値が取得できないか、$OHDR() の値になる。
以下例 test2, test3 は動作するが、test1 は動作しない(http://prx.dip.jp/ で試してください)
[HTTP headers] In = TRUE Out = TRUE Key = "URL: test1 $IHDR(Server: \0)" URL = "prx.dip.jp/(^?)$IHDR(Server: (^Proxomitron)\0)$ALERT(test1 Server: \0)" In = TRUE Out = TRUE Key = "URL: test2 $IHDR(Server: \0)" Match = "http://prx.dip.jp/(^?)$IHDR(Server: (^Proxomitron)\0)$ALERT(test2 Server: \0)" [Patterns] Name = "test3 $IHDR(Server: \0)" Active = TRUE URL = "prx.dip.jp/(^?)$IHDR(Server: (^Proxomitron)\0)$ALERT(test3 Server: \0)" Limit = 256 Match = "<start>"
使用可能な場所 : Incoming Header FilterとPatternsの検索表現・置換テキスト
matching は検索表現扱い。前方一致。
ステータスコード(「200 OK」「404 Not Found」など)のチェック。
使用可能な場所 : 検索表現
code は htm / css / js / vbs / oth のいずれかの文字に限られる。(大文字小文字は問わず)
Content-Typeのチェック。$IHDR(Content-Type:)で代用することも可能。
なお、通常は $TYPE(oth) に該当する Content-Type に対してはWebページフィルタが適用されないため、
そのままWebページフィルタで $TYPE(oth) を記述しても意味が無い。
ヘッダフィルタで $FILTER(true) を使っていれば有効に働く。
バージョンによりヘッダの値のマッチに差異がある。例: $TYPE(css)
使用可能な場所 : 検索表現・置換テキスト
keycode list は[0-9a-z]もしくは「^」で始まる独自のキー名かDuckDuckGo:仮想キーコード。大文字小文字は区別しない。
指定したキーが押されていたかどうかを判定し、押されていたらマッチする。2つ以上のキーを指定することも可能。
0~9、A~Zはそのまま書いてよい。
$KEYCHK(g) Gキー $KEYCHK(12) 1キー+2キー (ただしテンキーでは無効)
特別に用意されたキー名。
$KEYCHK(^c) Ctrlキー $KEYCHK(^a) Altキー $KEYCHK(^s) Shiftキー $KEYCHK(^t) TABキー $KEYCHK(^f1) F1キー (f2~f12も同様)
その他の特殊キー・記号キー・テンキー・マウスボタン等は10進数の仮想キーコードを用いる。
$KEYCHK(^13) Enterキー $KEYCHK(^192) [@]キー $KEYCHK(^97) テンキーの[1] $KEYCHK(^1^2^4) マウスの左ボタン+右ボタン+中ボタン
仮想キーコードは、一覧表を検索するか以下のようなスクリプトで調べよう。
<script>//IE用 (d=document).onkeydown=d.onmousedown=function(){ d.body.innerHTML+="<br>$KEYCHK(^"+(event.keyCode||event.button)+")"; return false;} </script>
アドレスバーに以下を入力して実行でもOK
javascript:(d=document).onkeydown=d.onmousedown=function(){d.body.innerHTML+="<br>$KEYCHK(^"+(event.keyCode||event.button)+")";return%20false;};eval()
使用可能な場所 : 置換テキスト
textは置換テキスト扱いではなく、変数使用不可
text内の一部の文字を、Proxomitronが動作しているPCの時間に書き換える。
「$DTM(Y/M/D H:m:s)」は、「2006/4/3 23:23:31」の様になる。
$SET(hour=$DTM(H)) の様に、変数に代入すれば$TSTを使用して検索表現にも使用可能
パラメータ | 2001年02月03日 04時05分06秒 GMT+9(JST) の例 | 説明 |
---|---|---|
年 | ||
Y | 2001 | 西暦年4桁 Year |
月 | ||
M | 2 | 月1桁 1 から 12 Month |
日 | ||
D | 3 | 日1桁 1 から 31 Day |
曜日 | ||
w | Sat | 英語曜日(3文字の省略文字型) Mon から Sun day of the week ※4.5以降のみ |
時 | ||
h | 04 | 時間2桁 01 から 12(AM0時でもPM0時でも12) hour ※4.3ではAM0時は00、PM0時は12を返す |
H | 04 | 時間2桁 00 から 23 Hour |
分 | ||
m | 05 | 分2桁 00 から 59 minute |
秒 | ||
s | 06 | 秒2桁 00 から 59 second |
全ての日付/時刻 | ||
d | 2001-2-3 | 西暦年4桁-月1桁-日1桁 = Y-M-D date |
E | 3/2/2001 | 日1桁/月1桁/西暦年4桁 = D/M/Y EU |
I | Fri, 02 Feb 2001 19:05:06 GMT | 英語曜日, 日2桁 英語月 西暦年4桁 時間2桁:分2桁:秒2桁 GMT ※グリニッジ標準時(日本時間はGMTに9時間足したもの) RFC 822, updated by RFC 1123 Internet Format |
T | 04:05:06 | 時間2桁:分2桁:秒2桁 = H:m:s Time |
U | 2/3/2001 | 月1桁/日1桁/西暦年4桁 = M/D/Y US |
その他 | ||
t | 858 | ミリ秒(1/1000秒) 00 から 999 thousand |
c | 23 | 現在の接続番号 1 から 無限? connection LogWindowに表示される +++GET 23+++, +++RESP 23+++, +++CLOSE 23+++ の数字部分 どの通信でマッチしたかの判断に使える |
a | am | 午前ならamを、午後ならpmを返す am/pmのa |
p | am | 午前ならamを、午後ならpmを返す am/pmのp |
月2桁、日2桁は無い
使用可能な場所 : 置換テキスト
filenameにはコマンド等使用不可
filenameで指定された任意のローカルファイルを読み込み、その内容を返す。
$FILE(C:\\temp\\aaa.txt) $FILE(C:/temp/bbb.css) $FILE(html\\ccc.js)
フォルダの区切りは \\ か / を使う必要がある。 ドライブ名を省略するとproxomitron.exeのあるフォルダを表す。 \d や http:// で始まるパスは使えない。日本語を含むパスの場合、2バイト目が \ ( 0x5C ) である文字はエスケープしなければならない。このコマンドは呼ばれるごとにファイルを読みに行く(メモリに蓄積はされない)ので、ファイルの更新はすぐに反映される。
このコマンドを用いてフィルタエディタだけでは実現できない置換が可能となる。 例えばUTF-16LEのページにおいて 0x00 を含む文字列をReplaceしたい場合に、フィルタエディタからは困難である。ところが、Replaceしたい内容をあるテキストファイルにUTF-16LEで保存*1 しておき、
Replace = "$FILE(html\\UTF16LE.txt)"
などとしておけば比較的容易である。
<start>、<end> はメタキャラクタの一種で、Match 欄に単独で記述した場合のみ有効となる。
例えば以下のように他の文字をつけると無効となり、その部分は単なる「<start>」「<end>」という文字のパターンとして解釈される。
また、単独で記述した場合でもテストウィンドウでは無効化される (「マッチさせる語句(Match)」の先頭や末尾ではなく、文中の <start> や <end> というテキストにマッチしてしまう)。
一つのフィルタにつきページの先頭または末尾の1回のみに反応するので、Replace 欄に $STOP() を書く必要はない。
<start> あるいは <end> を使うフィルタが複数あっても Multi = "true" は不要で、普通のフィルタと同じく上から順にマッチしていく。
Bounds と Limit の値は無視される。よって、変数・コマンド・条件分岐等は URL = "~" 内に書く必要がある。
URL = "$URL(\0)($IHDR(Last-Modified:\1)|)" Match = "<start>" Replace = "<!-- \0 \1 -->"
ウェブサーバによっては、Ajax や Flash から読み込まれるデータファイルの Content-Type が正しくないことがある (JSON やプレーンテキストなのに Content-Type: text/html を返すなど)。
そのようなデータファイルに <start>、<end> が適用され Replace = "~" が挿入されると、 正しくないデータ形式になってしまうため正常に動作しなくなることがある (普通のWebページフィルタでも誤マッチは起こりうるが、<start> と <end> の場合は常にマッチするため問題となりやすい)。
回避するには以下のような方法がある。
$OHDR(X-Requested-With: XMLHttpRequest) $OHDR(x-flash-version: *)
使用可能な場所 : [Patterns]のMatch
$TYPE(htm) に該当する接続の場合のみ適用される。
ウェブページの先頭に一致する。JavaScript や CSS を埋め込む時などに使用する。
<start>でなんらかの文字列をページ先頭に挿入すると、IE6のDOCTYPEスイッチが無効になるので、回避する場合は以下のように書き換える。
URL = "$TYPE(htm)" Limit = 256 Match = " (<!DOCTYPE*>|)\0$STOP()" Replace = "\0<挿入文>"
<start>で大量の文字列をページ先頭に挿入すると、IEの文字コード自動判別が上手く動作しなくなる事がある。それを回避するには例えば以下のように書き換える。
URL = "$TYPE(htm)" Match = "(^(^<(script|/head|body)))$STOP()" Replace = "<挿入文>"
使用可能な場所 : [Patterns]のMatch
$TYPE(htm) に該当する接続の場合のみ適用される。
ウェブページの末尾に一致する。JavaScript や CSS を埋め込む時などに使用する。
他のフィルタが \k で読み込みを中止した場合でも働く。 この場合、置換テキストの出力は \kフィルタ → <end>フィルタ の順となる。
http://proxomitron.sakura.ne.jp/help/URL_Commands.html
# Amazonにアクセスした時だけ自動でAmazon.cfgに切り替えて特定のフィルタのみ処理する例 ([^/]++.|)(images-|)amazon.co(.jp|m)/ $LOG(C$DTM(c): Load Amazon.cfg) $JUMP(http://\xload//Amazon.cfg?\u) # ※Amazon.cfgからdefault.cfgに自動で戻すようにした場合、AmazonとAmazon以外の混成ページを読み込んだ時におかしなことになり、再起動させないと接続できなくなる # また、$RDIRを使うと妙なエラーが出ることがある様子 # ProxomitronやProxydomoを複数異なるポートで待機させておき、ブラウザのアドオン機能などでURL毎に自動的に異なるProxyを使うようにしたほうがいい(勿論URL欄や$URLなどで絞り込めるならそうしたほうがいい)
4.5June+6 からはIE7対策のため、URL コマンドを . だけでも使えるようになっている(例: http://dbug.whois.jp/)