目次

質問：

質問：

プロキシ Pac ファイルとは何ですか。例を挙げてください。

環境： Cisco Web セキュリティ アプライアンス

注： このナレッジ ベース記事では、シスコによる保守およびサポートの対象でないソフトウェアを参照しています。  情報は、利便性のために無償で提供されています。 さらにサポートが必要な場合は、ソフトウェア ベンダーに連絡してください。

関連リンク： JavaScript or JScript Auto-Proxy Example Files

JavaScript or JScript Auto-Proxy Example Files

次のスクリプトは、「.pac」ファイルを使用して自動プロキシ URL を指定する方法の例を示します。 これらの関数を使用するには、プロキシ名、ポート番号、および IP アドレスを変更する必要があります。

1. isInNet、isResolvable、および dnsResolve の各関数は DNS サーバに照会します。

2. オブジェクト モデルの各オブジェクト、プロパティ、またはメソッドを参照すると、プロキシの自動コンフィギュレーション ファイルが何もを表示せずに失敗します。 たとえば、window.open(...)、alert(...)、および password(...) という参照はすべて、Internet Explorer で、プロキシの自動コンフィギュレーション ファイルの失敗を引き起こします。

例 1： ローカル ホストは直接接続し、それ以外はすべて、プロキシ経由で接続する

次の関数は、ホスト名がローカル ホストであるかどうかをチェックし、そうである場合は、直接接続かどうかを調べます。 ホスト名がローカル ホストでない場合は、プロキシ（proxy）経由の接続です。

function FindProxyForURL(url, host)

{

if (isPlainHostName(host))

return "DIRECT";

else

return "PROXY proxy:80";

}

isPlainHostName 関数は、ホスト名にドットが含まれるかどうかを調べます。 含まれる場合は false が返され、 それ以外の場合は true が返されます。

注: ローカル Web サーバへの直接接続の場合は、ドメインまたはサブネットが一致することが必要な場合があります。 ローカル Web サーバへのすべての要求が、ホスト名だけを使用して行われるわけではありません。

例 2： ファイアウォールの内側のホストは直接接続し、外部のローカル サーバはプロキシ経由で接続する

次の関数は、ホストが「プレーンな」ホスト名（つまり、ドメイン名が含まれない）であるか、特定のドメイン（.company.com）の一部である（ただし、www でも home でもない）かを調べます。

function FindProxyForURL(url, host)

{

if ((isPlainHostName(host) ||

dnsDomainIs(host, ".company.com")) &&

!! localHostOrDomainIs(host, "www.company.com") &&

!! localHostOrDoaminIs(host, "home.company.com"))

return "DIRECT";

else

return "PROXY proxy:80";

}

注:

- localHostOrDomainIs 関数は、ローカル ドメイン内の URL にだけ実行されます。

- dnsDomainIs 関数は、ホスト名のドメインが特定のドメインに一致する場合は true を返します。

例 3： ホストが解決可能な場合は直接接続する。 それ以外の場合は、プロキシを使用して接続する。

次の関数は、渡されたホスト名の解決を試みることを DNS サーバに依頼します。 解決できる場合は、直接接続されます。 解決できない場合は、プロキシ経由で接続されます。 これは、内部 DNS サーバを使用して、すべての内部ホスト名を解決する場合に便利です。

function FindProxyForURL(url, host)

{

if (isResolvable(host))

return "DIRECT";

else

return "PROXY proxy:80";

}

ページの上部にある isResolvable 関数に関する注を参照してください。

例 4： 指定したサブネット内のホストの場合は直接接続する。 それ以外の場合は、プロキシを使用して接続する。

次の関数は、特定の IP アドレスのパターンを比較し、ホスト名でマスクします。 これは、サブネット内の一部のホストが直接接続され、それ以外のホストはプロキシを使用して接続される場合に便利です。

function FindProxyForURL(url, host)

{

if (isInNet(host, "999.99.9.9", "255.0.255.0"))

return "DIRECT";

else

return "PROXY proxy:80";

}

ページの上部にある isInNet 関数に関する注を参照してください。

isInNet(host, pattern, mask) 関数は、ホストの IP アドレスが、指定したパターンに一致する場合は true を返します。 マスクは、一致させる IP アドレスの部分を示します（255 = 一致、0 = 無視）。

例 5： ホストのドメインに基づいて接続タイプを決定する

次の関数は、ホストがローカルの場合に直接接続を指定します。 ホストがローカルでない場合、この機能は、ホストのドメインに基づいて、使用するプロキシを決定します。 これは、ホストのドメイン名がプロキシの選択基準の 1 つである場合に便利です。

function FindProxyForURL(url, host)

{

if (isPlainHostName(host))

return "DIRECT";

else if (shExpMatch(host, "*.com"))

return "PROXY comproxy:80";

else if (shExpMatch(host, "*.edu"))

return "PROXY eduproxy:80";

else

return "PROXY proxy";

}

shExpMatch(str, shexp) 関数は、str が、シェルの表現パターンを使用して shexp に一致する場合は true を返します。

例 6： 使用されるプロトコルに基づいて接続タイプを決定する

次の関数は、使用されるプロトコルを抽出し、それに従ってプロキシを選択します。 プロトコルに一致するものがない場合は、直接接続されます。 これは、使用されるプロトコルがプロキシの選択基準の 1 つである場合に便利です。

function FindProxyForURL(url, host)

{

if (url.substring(0, 5) == "http: ") {

return "PROXY proxy:80";

}

else if (url.substring(0, 4) == "ftp: ") {

return "PROXY fproxy:80";

}

else if (url.substring(0, 7) == "gopher: ") {

return "PROXY gproxy";

}

else if (url.substring(0, 6) == "https: ") {

return "PROXY secproxy:8080";

}

else {

return "DIRECT";

}

}

substring 関数は、指定した数の文字を文字列から抽出します。

例 7： ホスト名が IP アドレスに一致するかどうかを調べてプロキシ設定を決定する

次の関数は、ホスト名を IP アドレスに変換し、指定された文字列と比較して、プロキシを選択します。

function FindProxyForURL(url, host)

{

if (dnsResolve(host) == "999.99.99.999") { // = http://proxy

return "PROXY secproxy:8080";

}

else {

return "PROXY proxy:80";

}

}

ページの上部にある dnsResolve 関数に関する注を参照してください。

例 8： ホスト IP アドレスが、指定した IP に一致する場合はプロキシ経由で接続し、それ以外の場合は直接接続する

次の関数は、指定した IP アドレスに基づいてプロキシを選択する、もう 1 つの方法です。 この例では、例 7 とは異なり、関数呼び出しを使用して、IP アドレス数値を明示的に取得します（例 7 では、dnsResolve 関数を使用して、ホスト名を IP アドレス数値に変換しています）。

function FindProxyForURL(url, host)

{

if (myIpAddress() == "999.99.999.99") {

return "PROXY proxy:80";

}

else {

return "DIRECT";

}

}

myIpAddress 関数は、ブラウザが実行されているホストの IP アドレス（整数とドットの形式）を返します。

例 9： ホスト名にドットが含まれる場合はプロキシを使用して接続する。 それ以外の場合は、直接接続する。

次の関数は、ホスト名に含まれるドットの数を調べます。 ホスト名にドットが含まれる場合は、プロキシ経由で接続します。 ホスト名にドットが含まれない場合は、直接接続します。 これは、ホスト名の特性に基づいて接続タイプを決定する、もう 1 つの方法です。

function FindProxyForURL(url, host)

{

if (dnsDomainLevels(host) > 0) { // if the number of dots in host > 0

return "PROXY proxy:80";

}

return "DIRECT";

}

dnsDomainLevels 関数は、ホスト名に含まれるドットの数に相当する整数を返します。

例 10： プロキシ経由で接続する曜日を指定し、他の曜日には直接接続する

次の関数は、プロキシが適している曜日を指定して接続タイプを決定します。 これらのパラメータの範囲外の曜日には、直接接続を使用します。 この関数は、トラフィックが重いときはプロキシを使用し、トラフィックが軽いときには直接接続を許可する場合に便利である可能性があります。

function FindProxyForURL(url, host)

{

if(weekdayRange("WED", "SAT", "GMT"))

return "PROXY proxy:80";

else

return "DIRECT";

}

weekdayRange(day1 [,day2] [,GMT] ) 関数は、現在のシステム時間が、パラメータ day1、day2、および GMT で指定された範囲内であるかどうかを返します。 最初のパラメータだけが必須です。 GMT パラメータは、時間の値がローカル タイム ゾーンではなく、グリニッジ標準時であることを想定します。

例 11： 単純な Math 関数によるロード バランシング

function FindProxyForURL(url, host){

return randomProxy();

}

function randomProxy()

{

switch( Math.floor( Math.random() *2))

{

case 0: return "PROXY 1.1.1.1:3128; PROXY 2.2.2.2; PROXY DIRECT; "」

case 1: return "PROXY 2.2.2.2:3128; PROXY 1.1.1.1; PROXY DIRECT; "」

}

}

case により、1 台のプロキシが使用できない場合のフェールオーバーも実行されます。