メインコンテンツまでスキップ

PAC (Proxy auto-config) 文法

備考

文書にエラーがある場合、または提案がある場合は、メッセージを Mudfish フォーラム (https://forums.mudfish.net) に残してください。ここに記載されている例や説明は、以下のサイトの内容を翻訳または参照して作成されています。

Mudfish ブラウザ拡張機能の場合、PAC (Proxy auto-config) ファイル形式をサポートします。

PAC関数​

PACフォーマットをサポートするブラウザは、通常、Netscape社によって指定された標準フォーマットで提示された関数をサポートするようになっています。

ただし、これらの機能は通常 sandbox 内で動作するため、厳しく制限された環境で実行されます。たとえば、User Agent 情報の参照はできません。

以下は sandbox 環境内で許容される関数について記述しました。

dnsDomainIs​

Hostnameを調べて互いに一致する場合はtrueを返します。通常、例外的な個々のhostnameを調べるときに使用されます。

   // hostname が google.com、またはそのサブドメイン
//(例: maps.google.com、www.google.com)に一致する場合、
// プロキシを経由せずに直接接続します。

if (dnsDomainIs(host, "google.com"))
return "DIRECT";

shExpMatch​

HostnameまたはURLをシェル式で指定された文字列と比較して一致する場合はtrueを返します。

   // .local で終わる hostname へのすべてのリクエストを
// プロキシを経由せずに直接接続します。

if (shExpMatch(url, "*.local"))
return "DIRECT";

// vpn.domain.com、または http://abcdomain.com/folder/ 配下の
// フォルダやファイルへのリクエストを
// プロキシを経由せずに直接接続します。

if (shExpMatch(host, "vpn.domain.com") ||
shExpMatch(url, "http://abcdomain.com/folder/*"))
return "DIRECT";

isInNet​

この関数は、hostnameのIPアドレスを調べて特定のサブネットの下に存在する場合はtrueを返します。 hostnameが引数に渡されると、DNS resolvingを介してIP変換操作が行われます。

   // 名前解決後の hostname の IP アドレスが、指定した
// IP アドレス範囲に含まれる場合は直接接続します。

if (isInNet(dnsResolve(host), "172.16.0.0", "255.240.0.0"))
return "DIRECT";

myIpAddress​

現在私のコンピュータのIPアドレスを返します。

   // 自分のコンピュータが指定した IP アドレス範囲に属する場合、
// プロキシ 10.10.5.1 のポート 8080 を経由します。

if (isInNet(myIpAddress(), "10.10.1.0", "255.255.255.0"))
return "PROXY 10.10.5.1:8080";

dnsResolve​

DNS resolvingを介してhostnameをIPアドレスに変換します。

   // リクエスト先の host の IP が指定範囲に属する場合は直接接続します。

if (isInNet(dnsResolve(host), "10.0.0.0", "255.0.0.0") ||
isInNet(dnsResolve(host), "172.16.0.0", "255.240.0.0") ||
isInNet(dnsResolve(host), "192.168.0.0", "255.255.0.0") ||
isInNet(dnsResolve(host), "127.0.0.0", "255.255.255.0"))
return "DIRECT";

isPlainHostName​

hostname に .(ドット)が含まれていない場合は true を返します。例えば http://intranet と同じことを言いますが、通常内部ネットワークのWebアドレスにアクセスする場合に使用できます。

   // 単純な hostname(例: http://intranet/ や
// http://webserver-name01/)へのリクエストは直接接続します。

if (isPlainHostName(host))
return "DIRECT";

localHostOrDomainIs​

Hostnameを調べて、hostname部分が互いに一致する場合はtrueを返します。

   // リクエスト先の hostname が "www" または "www.google.com" なら
// 直接接続します。

if (localHostOrDomainIs(host, "www.google.com"))
return "DIRECT";

isResolvable​

HostnameをIPアドレスに変換し、成功した場合はtrueを返します。

ドメインの名前解決に失敗すると、ブラウザが一時的に応答しなくなることがあります。注意して使用してください。

   // リクエスト先の hostname を DNS サーバーで名前解決できれば、
// proxy1.example.com を経由します。

if (isResolvable(host))
return "PROXY proxy1.example.com:8080";

dnsDomainLevels​

Hostname を調べて、その文字列に含まれる .(ドット)の数を返します。たとえば、内部ネットワークWebサーバーを例外として指定するときに使用できます。

   // hostname に .(ドット)が含まれていれば proxy1.example.com を
// 経由し、含まれていなければ直接接続します。

if (dnsDomainLevels(host) > 0)
return "PROXY proxy1.example.com:8080";
else
return "DIRECT";

weekdayRange​

時間に基づいてルールを作成するときに使用できます。たとえば、特定の日にのみプロキシ設定を返すようにしたい場合に使用できます。

   // 月曜日から金曜日までは proxy1.example.com を経由し、
// それ以外はインターネットに直接接続します。

if (weekdayRange("MON", "FRI"))
return "PROXY proxy1.example.com:8080";
else
return "DIRECT";

dateRange​

時間に基づいてルールを作成するときに使用できます。たとえば、特定の月にproxyを適用したい場合に使用できます。


// 1 月から 3 月までは proxy1.example.com を経由し、
// それ以外は直接接続します。

if (dateRange("JAN", "MAR"))
return "PROXY proxy1.example.com:8080";
else
return "DIRECT";

timeRange​

特定の時間帯でのみproxyを使用したい場合に使用できます。

   // 午前 8 時から午後 6 時までは proxy1.example.com を経由し、
// それ以外は直接接続します。

if (timeRange(8, 18))
return "PROXY proxy1.example.com:8080";
else
return "DIRECT";

alert​

この関数の場合、初めて PAC フォーマットが定義されたときはありませんでしたが、 troubleshooting をするために Internet Explorer と Firefox ブラウザの場合定義となっている関数です。

   // ブラウザのエラーコンソールに名前解決の結果を表示します。

resolved_host = dnsResolve(host);
alert(resolved_host);