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() を直接使うと、評価の設定ではなく端末の時計になります。
使い方
- 「ダウンロード」で
pac-tester.html を保存し、開きます
- 「PAC ファイル」の欄に PAC を貼り付けます
- 「テストする URL」に、URL を 1 行に 1 つ書きます
- 自動で評価され、「結果」の表に URL ごとの戻り値が出ます
くわしい使い方と評価の設定
- 紹介ページの「ダウンロード」で
pac-tester.html を保存し、ダブルクリックで開きます(「ブラウザで試す」でも同じものが開きます)
- 左の「PAC ファイル」の欄に PAC を貼り付けます。「開く」で .pac ファイルを選ぶか、画面にドラッグ&ドロップしても開けます。UTF-8 として読めないファイルは Shift_JIS として読みます
- 右の「テストする URL」に、確かめたい URL を 1 行に 1 つ書きます。
http:// を省くと http として扱います。# で始まる行はメモです。一覧は「.txt を開く」「.txt で保存」で読み書きできます
- 入力するたびに自動で評価されます(Ctrl+Enter か「評価する」でもすぐ評価します)。「結果」の表に、URL ごとの戻り値が出ます
- 結果の上の色つきのボタンは、戻り値ごとの件数です。押すとその戻り値の行だけに絞り込みます。文字での絞り込み、「エラー・注意だけ」、「CSV で保存」もできます
- 「構文・ロジックのチェック」に、見つかった問題が出ます。押すと PAC のその行に移動します
- 画面が狭いときは、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 の結果だけが変わっているか」を確かめるためのモードです。
差分モードの手順
- 上の「差分モード」を押すと、PAC の欄が「旧 PAC(いまの版)」と「新 PAC(変更後)」の 2 つになります。新 PAC の欄には、はじめは旧 PAC と同じ内容が入ります
- 旧 PAC に今使っている PAC を、新 PAC に変更後の PAC を入れます(それぞれ「開く」やドラッグ&ドロップでも入れられます)
- 同じ 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) など
結果の表と合わせて確かめてください。
ダウンロードして使える、ほかの道具 → Markdown+Mermaid ビューア
同じ作者の、RSAT なしで Active Directory を調べる PowerShell ライブラリ → ADSearch
ご利用上の注意・データの扱い
- 実際のブラウザや OS の評価結果とは、DNS・時刻・実装差によって異なることがあります。最終的な確認は、実際に使う環境で行ってください。
- 評価の設定はこの端末のブラウザ(localStorage、キー
pac-tester_settings)にだけ保存され、外部には送信されません。PAC とテスト用の URL は、「このブラウザに保存する」をオンにしたときだけ pac-tester_draft に保存し、オフに戻すと消します。
結果の違い・保存される設定・見本
- 結果の扱い:このツールは 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 には、次のライブラリをそのまま埋め込んでいます。
| ライブラリ | バージョン | ライセンス | 用途 |
| acorn | 8.18.0 | MIT | PAC の構文を調べる(構文木を作るだけで、PAC は実行しない) |
ライセンスの全文は、THIRD_PARTY_LICENSES.txt と、pac-tester.html の「ライセンス」ボタンで見られます。
ご要望・不具合の報告(Google フォーム):いただいた内容をもとに直します。お返事はしていません。
サイト全体の運営者情報・免責事項はこちら、プライバシーポリシーはこちらです(すべてのツールで共通)。