質問:
プロキシ Pac ファイルとそのサンプルについて
環境: Cisco Web Security Appliance
注:このナレッジベース記事では、シスコによる保守およびサポートの対象でないソフトウェアを参照しています。 この情報は、利便性のために無償で提供されています。さらにサポートが必要な場合は、ソフトウェアのベンダーに連絡してください。
参照リンク: JavaScriptまたはJScript自動プロキシサンプルファイル
JavaScript または JScript 自動プロキシ サンプル ファイル
次のスクリプトは、「.pac」ファイルを使用して自動プロキシ URL を指定する方法の例を示しています。これらの関数を使用するには、プロキシ名、ポート番号、および IP アドレスを変更する必要があります。
- isInNet、isResolvable、および dnsResolve の各関数は、DNS サーバを照会します。
- オブジェクト モデルの各オブジェクト、プロパティ、またはメソッドを参照すると、プロキシ自動構成ファイルが何も表示せずに失敗します。たとえば、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") &&
!localHostOrDomainIs(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))
{
ケース0:「PROXY 1.1.1.1:3128; PROXY 2.2.2.2; PROXY DIRECT;」を返します。
ケース1:「PROXY 2.2.2.2:3128; PROXY 1.1.1.1; PROXY DIRECT;」を返します
}
}
複数の case により、1 つのプロキシが使用できない場合にはフェールオーバーが実行されます。