PAC ファイル テスター の使い方

PAC の基本・ヘルパー関数の一覧・よくあるミス・差分モード・安全性・よくある質問

English

▶ PAC ファイル テスターのダウンロードはこちら

PAC の基本

PAC(Proxy Auto-Configuration)ファイルは、ブラウザや OS が「この URL にはどのプロキシを使うか」を決めるための JavaScript のファイルです。中には FindProxyForURL(url, host) という関数を 1 つ書きます。

書き方の例と戻り値

名前は proxy.pac や wpad.dat がよく使われます。ブラウザは URL を開くたびにこの関数を呼び、戻り値の文字列に従って接続します。

function FindProxyForURL(url, host) {
  if (isPlainHostName(host)) return "DIRECT";
  if (dnsDomainIs(host, ".example.com")) return "DIRECT";
  return "PROXY proxy.example.net:8080; DIRECT";
}
  • url は URL 全体(例: http://www.example.com/a/b)、host はホスト名だけ(例: www.example.com。小文字で、ポート番号は含まない)
  • 戻り値は "DIRECT"(プロキシを通さない)か "PROXY ホスト:ポート"。; で区切って並べると、前のものが使えないときに次のものを使います
  • SOCKS ホスト:ポート・HTTPS ホスト:ポート などが使えるブラウザもあります

ヘルパー関数の一覧と注意点

isInNet・shExpMatch など、PAC の中で使える標準の関数です。動きは Firefox・Chromium の実装に合わせています。

関数の一覧(14 個)と注意点

Firefox・Chromium の実装は、どちらも Netscape の元の実装を引き継いだものです。

関数働き注意点
isPlainHostName(host)ホスト名にドットが無いか(例: intranet)IPv6 アドレス(: を含む)は false
dnsDomainIs(host, domain)host が domain で終わるか大文字・小文字を区別する。"example.com" のように先頭のドットが無いと badexample.com にも当てはまる
localHostOrDomainIs(host, hostdom)完全に同じか、ドメイン無しの名前が hostdom の先頭と同じかlocalHostOrDomainIs("www", "www.example.com") は true
isResolvable(host)IP アドレスに解決できるか対応表に無いホストは false
isInNet(host, pattern, mask)IP アドレスがそのネットワークに入るかホスト名は対応表で IP にしてから比べる。マスクは "255.255.0.0" の形(/16 は使えない)
dnsResolve(host)IP アドレスを返す解決できなければ null
convert_addr(ip)IP アドレスを 32 ビットの整数にするブラウザと同じく符号付き(192.168.0.1 は負の数)
myIpAddress()自分の IP アドレス評価の設定の値を返す
dnsDomainLevels(host)ドットの数www.example.com は 2
shExpMatch(str, pattern)ワイルドカードでの一致* は 0 文字以上、? は 1 文字。全体が一致したときだけ true。大文字・小文字を区別する。ほかの記号は文字そのもの(ブラウザによっては [ ] や + が正規表現として効いてしまうので、使わないのが安全)
weekdayRange(wd1, wd2, "GMT")曜日の範囲"MON" のように大文字の英語 3 文字。"FRI", "MON" のように週をまたげる。最後に "GMT" で UTC の曜日
dateRange(…)日・月・年の範囲終わりに月だけを書くと、その月の末日まで(ブラウザの実装では 31 日の無い月で数日ずれることがある)
timeRange(…)時刻の範囲timeRange(9, 17) は 9:00〜17:59。時だけの指定は日をまたがない(timeRange(22, 6) は常に false)。timeRange(22, 0, 6, 0) なら日をまたげる
alert(message)メッセージを出す結果の表の、その URL の行に出る

PAC の中で eval や new Function は使えません(安全のため禁止しています)。new Date() を直接使うと、評価の設定ではなく端末の時計になります。

使い方

  1. 「ダウンロード」で pac-tester.html を保存し、開きます
  2. 「PAC ファイル」の欄に PAC を貼り付けます
  3. 「テストする URL」に、URL を 1 行に 1 つ書きます
  4. 自動で評価され、「結果」の表に URL ごとの戻り値が出ます
くわしい使い方と評価の設定
  1. 紹介ページの「ダウンロード」で pac-tester.html を保存し、ダブルクリックで開きます(「ブラウザで試す」でも同じものが開きます)
  2. 左の「PAC ファイル」の欄に PAC を貼り付けます。「開く」で .pac ファイルを選ぶか、画面にドラッグ&ドロップしても開けます。UTF-8 として読めないファイルは Shift_JIS として読みます
  3. 右の「テストする URL」に、確かめたい URL を 1 行に 1 つ書きます。http:// を省くと http として扱います。# で始まる行はメモです。一覧は「.txt を開く」「.txt で保存」で読み書きできます
  4. 入力するたびに自動で評価されます(Ctrl+Enter か「評価する」でもすぐ評価します)。「結果」の表に、URL ごとの戻り値が出ます
  5. 結果の上の色つきのボタンは、戻り値ごとの件数です。押すとその戻り値の行だけに絞り込みます。文字での絞り込み、「エラー・注意だけ」、「CSV で保存」もできます
  6. 「構文・ロジックのチェック」に、見つかった問題が出ます。押すと PAC のその行に移動します
  7. 画面が狭いときは、PAC・チェック・URL・結果が縦に並びます。PAC の確認はパソコンでの利用を主に想定しています

評価の設定

  • ホスト名と IP アドレスの対応表:DNS の代わりです。dnsResolve・isInNet・isResolvable がこの表を使います。1 行に「ホスト名 IP アドレス」(hosts ファイルと同じ「IP アドレス ホスト名」の順でも可)。*.example.com 10.0.0.1 と書くと、その下のホストすべてに当てはめます
  • myIpAddress() が返す IP アドレス:拠点ごとにプロキシを分ける PAC を、拠点の IP アドレスを入れて確かめられます
  • 評価に使う日時:weekdayRange・dateRange・timeRange が使う日時と、UTC との時差です。「いまの日時を使う」を外すと、好きな日時で確かめられます
  • https の URL は、パスとクエリを除いて渡す:Chrome・Edge などと同じ動きです(既定でオン)

差分モード

PAC を更新するときに「意図した URL の結果だけが変わっているか」を確かめるためのモードです。

差分モードの手順
  1. 上の「差分モード」を押すと、PAC の欄が「旧 PAC(いまの版)」と「新 PAC(変更後)」の 2 つになります。新 PAC の欄には、はじめは旧 PAC と同じ内容が入ります
  2. 旧 PAC に今使っている PAC を、新 PAC に変更後の PAC を入れます(それぞれ「開く」やドラッグ&ドロップでも入れられます)
  3. 同じ URL の一覧で両方を評価し、結果が変わった行だけに色と「変更」の印が付きます。変わった件数は結果の上に出ます。「変わった行だけ」で、変わった行に絞り込めます

戻り値の ; の前後の空白の違いは、変化として数えません。エラーやタイムアウトになった場合は変化として数えます。CSV には旧・新の両方の結果が入ります。

よくあるミス(チェックで見つけるもの)

全角スペース・全角記号の混入、括弧・引用符の対応、最後の return 漏れ、shExpMatch のパターンの誤り、ルールの隠れ、戻り値の形、ヘルパー関数の使い方。チェックは構文を読み取って行う近似で、すべての誤りを見つけられるわけではありません。

それぞれのミスの例
  • 全角スペース・全角記号の混入:日本語のコメントを書いたあとに、全角スペースや全角の括弧・引用符がコードに紛れ込むことがあります。全角スペースは JavaScript では空白として通ってしまうので、ブラウザでは気づきにくいミスです。コメントの中は問題なし、文字列の中は「注意」、コードの中は「エラー」として出します
  • 括弧・引用符の対応:{ }・( )・[ ] の対応がずれている場所と、閉じていない引用符を、行の番号つきで出します。構文エラーの内容も日本語で出します
  • 最後の return 漏れ:どの if にも当てはまらない URL で、関数の最後まで来てしまう書き方です。戻り値が undefined になり、ブラウザによって動きが変わります。最後に return "DIRECT"; などを書きます
  • shExpMatch のパターンの誤り:shExpMatch(host, ".example.com")(* の付け忘れで、どのホストにも当たらない)、shExpMatch(host, "http://…")(host にスキームは含まれない)、shExpMatch(url, "http://www.example.com")(url の最後の / が抜けている)、大文字の入ったパターンなど。パターンの一覧も出します
  • ルールの隠れ:shExpMatch(host, "*.example.com") の return より後に shExpMatch(host, "www.example.com") を書くと、下のルールには決して届きません。単純な if (shExpMatch(…)) return …; の並び(||・dnsDomainIs・host == "…" を含む)について、上のパターンが下のパターンをすべて含んでいる場合を見つけます。戻り値が同じなら「参考」、違えば「注意」です
  • 戻り値の形:"PROXY proxy.example.net:8080, DIRECT"(区切りは ;)、"PROXY" だけ、ポート番号の範囲外など
  • ヘルパー関数の使い方:isInNet のマスクの書き方、weekdayRange("mon")(小文字)、timeRange(22, 6) など

結果の表と合わせて確かめてください。

安全性(貼った PAC は外に出ない・隔離して実行)

くわしく
  • 通信しない:構文を調べるライブラリ(acorn)も含めてすべて 1 つのファイルに入っていて、外部のサーバーには接続しません。ブラウザの仕組み(Content-Security-Policy の connect-src 'none' など)でも、外部からの読み込み・外部への送信を禁止しています
  • 隔離して実行:PAC はプログラムなので、他人から受け取った PAC に悪いコードが入っている可能性もあります。そこで PAC は、このページでは実行せず、sandbox 属性を付けた iframe(ページとは別のオリジン)の中で起動した Worker で実行します。PAC のコードからは、このページの画面・保存領域(localStorage など)・同じサイトのほかのツールには触れられません。枠と Worker にも同じ通信の禁止がかかるので、PAC から情報を送り出すこともできません
  • 止められる:1 つの URL の評価が 0.2 秒を超えたら、Worker ごと止めて作り直します。無限ループがあっても画面は固まりません。止めた URL は「タイムアウト」と表示し、次の URL に進みます
  • 保存しない:貼った PAC とテスト用の URL は、既定ではブラウザにも保存しません(「このブラウザに保存する」をオンにしたときだけ保存します)
  • 広告・アクセス解析なし:pac-tester.html には入っていません(広告はこの使い方ページと紹介ページだけです)

よくある質問

isInNet や dnsResolve は、どうやって IP アドレスを調べますか?
ブラウザからは DNS を引けないので、「評価の設定」の「ホスト名と IP アドレスの対応表」を使います。対応表に無いホストは「解決できない」(dnsResolve は null、isResolvable と isInNet は false)になります。
https の URL で、パスを使った判定が効きません。
Chrome・Edge などは、https の URL のパスとクエリを PAC に渡さず「https://ホスト名/」だけを渡します。このツールも既定で同じ動きにしています(評価の設定で変えられます)。
isInNetEx などの Microsoft の拡張関数や、IPv6 には対応していますか?
対応していません。isInNetEx などの拡張関数は、呼ぶとエラーになります。

ダウンロードして使える、ほかの道具 → Markdown+Mermaid ビューア

同じ作者の、RSAT なしで Active Directory を調べる PowerShell ライブラリ → ADSearch

ご利用上の注意・データの扱い

結果の違い・保存される設定・見本
  • 結果の扱い:このツールは DNS を引かずに対応表を使い、時刻は設定した日時を使います。ブラウザ・OS ごとの PAC の実装の違い(https の URL のパスの扱い、使える関数や記号など)も再現しきれません
  • 保存されるデータ:評価の設定は、ホスト名と IP アドレスの対応表、myIpAddress の値、評価に使う日時と時差、https の扱いです
  • ファイルの扱い:開いた PAC や URL の一覧はブラウザの中で読むだけで、どこにも送信しません。CSV や URL の一覧の保存はダウンロードとして行います
  • 見本:見本の PAC は、架空のドメイン(example.com・example.net・example.org・.example)とプライベート・文書用の IP アドレスだけを使った一般的な例です
  • isResolvableEx・dnsResolveEx・myIpAddressEx・isInNetEx・sortIpAddressList などの拡張関数は、呼ぶとエラーになります。対応表や myIpAddress も IPv4 アドレスだけを扱います

ライセンス一覧

このツールのコードは MIT License です(GitHub)。

埋め込んでいるライブラリ

pac-tester.html には、次のライブラリをそのまま埋め込んでいます。

ライブラリバージョンライセンス用途
acorn8.18.0MITPAC の構文を調べる(構文木を作るだけで、PAC は実行しない)

ライセンスの全文は、THIRD_PARTY_LICENSES.txt と、pac-tester.html の「ライセンス」ボタンで見られます。

ご要望・不具合の報告(Google フォーム):いただいた内容をもとに直します。お返事はしていません。

サイト全体の運営者情報・免責事項はこちら、プライバシーポリシーはこちらです(すべてのツールで共通)。

更新履歴