Sun Java ロゴ     前へ      目次      索引      次へ     

Sun ロゴ
Sun Java System Web Proxy Server 4.0.1 管理ガイド 

第 17 章
クライアント自動設定ファイルの使用

多数のクライアントをサポートする複数のプロキシサーバーがある場合、クライアント自動設定ファイルを使用して、すべてのブラウザクライアントを設定することができます。自動設定ファイルには、さまざまな URL にアクセスする場合、ブラウザが使用するプロキシがあれば、どのプロキシを使用するかを決定する JavaScript 関数が含まれています。

ブラウザは、起動時に自動設定ファイルを読み込みます。ユーザーがリンクをクリックするか URL を入力するたびに、ブラウザは設定ファイルを使用して、プロキシを使用する必要があるかどうか、使用する場合はどのプロキシを使用するのかを決定します。この機能によって、組織内のブラウザのすべてのインスタンスを簡単に設定することができます。自動設定ファイルは、次のような複数の方法でクライアントに配布できます。

自動設定ファイルは次の 2 つの方法で作成することができます。サーバーマネージャーのページを使用するか、またはファイルを手動で作成できます。ファイルを作成するための指令については、この章の後半で説明します。

この章では、次の項目について説明します。


自動設定ファイルについて

この機能について取り上げる理由は、Proxy Server の管理者もクライアント自動設定ファイルを作成して配布する可能性があるからです。

自動設定ファイルの機能

自動設定ファイルは JavaScript で記述されています。JavaScript はコンパクトな、オブジェクトベースのスクリプト言語で、クライアントおよびサーバーのインターネットアプリケーションの開発に使用されます。ブラウザが JavaScript ファイルを解釈します。

ブラウザは最初の読み込み時に自動設定ファイルをダウンロードします。このファイルは、ブラウザが URL を使用してアクセスできる任意の場所に保存できます。たとえば、自動設定ファイルを Web サーバー上に保存することができます。ブラウザがファイル :// URL を使用して自動設定ファイルを取得できる場合には、自動設定ファイルをネットワークファイルシステム上に保存することができます。

プロキシ設定ファイルは JavaScript で記述されています。この JavaScript ファイルでは 1 つの関数 (FindProxyForURL) が定義されています。この関数は、各 URL に対してブラウザが使用するプロキシサーバーがあれば、どれを使用するのかを決定するものです。ブラウザは、JavaScript 関数に、ブラウザが実行されているシステムのホスト名と、取得しようとしている URL の 2 つのパラメータを送信します。JavaScript 関数は、処理方法を示す値をブラウザに返します。

自動設定ファイルを使用すると、さまざまなタイプの URL、さまざまなサーバー、または 1 日のうちのさまざまな時間に対して、異なるプロキシを指定できるようになります。またはプロキシをまったく指定しないこともできます。つまり、複数の専用のプロキシを用意できるので、たとえば、あるプロキシを .com ドメイン、別のプロキシを .edu ドメイン、さらに別のプロキシをその他すべてのドメイン用にすることができます。これによって、負荷を分散して、プロキシのディスクをさらに効率的に使用できるようになります。同じドキュメントを複数のプロキシすべてで保存するのではなく、どのファイルについてもキャッシュ内にコピーが 1 つ存在するだけだからです。

自動設定ファイルはプロキシのフェイルオーバーもサポートしているので、プロキシサーバーが使用できない場合、ブラウザはユーザーに意識させずに別のプロキシサーバーに切り替えを行います。

Web サーバーとしてのプロキシへのアクセス

プロキシサーバー上に 1 つ以上の自動設定ファイルを保存し、そのプロキシサーバーを、自動設定ファイルを唯一のドキュメントとする Web サーバーとして機能させることができます。これによって、プロキシの管理者は、組織内のクライアントが必要とするプロキシ自動設定ファイルを保持することができます。また、ファイルを中央で保持できるので、ファイルを更新する必要がある場合は、中央のファイルを一度更新するだけで、すべてのブラウザクライアントにより自動的に更新が取得されます。

プロキシ自動設定ファイルは、server- root/proxy-serverid/pac/ ディレクトリで保持されます。ブラウザでは、プロキシ自動設定ファイルへの URL を「Proxies」タブに入力します。プロキシの URL は次の書式になります。

http://proxy.domain:port/URI

たとえば、URL は http://proxy.example.com となります。URI (URL 内の host:port の組み合わせのあとの部分) を入力する必要はありませんが、URI を使用すれば、テンプレートを使用してさまざまな自動設定ファイルへのアクセスを制御できます。たとえば、/proxy.pac という自動設定ファイルを格納する /test という URI を作成すると、リソースパターン http://proxy.mysite.com:8080/test/.* を使用したテンプレートを作成できます。次に、このテンプレートを使用して、そのディレクトリ固有のアクセス制御を設定することができます。

複数の自動設定ファイルを作成し、それぞれが異なる URL 経由でアクセスするように設定できます。表 17-1 は、クライアントがアクセスするために使用する URI と URL の例をいくつか示しています。

表 17-1 URI の例とそれに対応する URL

URI (パス)

プロキシへの URL

/

http://proxy.mysite.com

/employees

http://proxy.mysite.com/employees

/group1

http://proxy.mysite.com/group1

/managers

http://proxy.mysite.com/managers

逆プロキシによる pac ファイルの使用

逆プロキシの機能から考えて、プロキシサーバーを逆プロキシとして動作させ、その上.pac ファイルを処理することは非常に困難です。これは、プロキシサーバーがファイルに対する要求を受け取ったときに、その要求がローカルの .pac ファイルに対するものなのか、それともリモートドキュメントに対するものなのかを判断する必要があるからです。

.pac ファイルの管理および配布に加えて、プロキシサーバーを逆プロキシとして動作させるには、obj.conf ファイルを手動で編集して、NameTrans 関数の順序が正しいことを確認する必要があります。

プロキシサーバーが逆プロキシとして動作するように、通常マッピングを作成します。このマッピングは、通常、すべての要求をリモートコンテンツサーバーに向けてルーティングするようプロキシに指示します。プロキシ自動設定ファイルを追加し、これを特定のディレクトリ (/pac など) にマップすることができます。ここでは、.pac ファイルを受け取るクライアントはすべて、次のような URL を使用します。

http://proxy.mysite.com/pac


警告

ただし、このマッピングでは、リモートコンテンツサーバーに同じようなディレクトリが存在していないことを確認する必要があります。


obj.conf ファイルを編集し、プロキシ自動設定ファイルに関する指令および関数が、ほかのマッピングより先に表示されていることを確認します。プロキシサーバーは通常、要求を処理する前にすべての NameTrans 関数を実行するので、この指令と関数が先に置かれている必要があります。ただし、自動設定ファイルの場合は、プロキシが即座にパスを認識して、 .pac ファイルを返します。

次に、逆プロキシを使用し、自動設定ファイルを管理する obj.conf ファイルの記述例を示します。

<Object name="default">
NameTrans from="file:"fn="map" to="ftp:"
NameTrans from="/pac" fn="pac-map" name="file" to="/ns-home/proxy/pac/proxy.pac"
NameTrans fn="redirect" from="http://foo.*" url="http://www.acme.com"
NameTrans from="/ns-icons" fn="pfx2dir" dir="/ns-home/ns-icons" name="file"
NameTrans fn="reverse-map" from="http://web.acme.com" to="http://proxy.acme.com:8080"
NameTrans fn="map" from="http://proxy.acme.com:8080" to="http://web.acme.com"
NameTrans fn="map" from="/" to="http://web.acme.com"
PathCheck fn="url-check"
Service fn="deny-service"
AddLog fn="flex-log" name="access"
AddLog fn="urldb-record"
</Object>


サーバーマネージャーのページを使用した自動設定ファイルの作成

サーバーマネージャーのページを使用して自動設定ファイルを作成するには
  1. サーバーマネージャーにアクセスし、「Routing」タブを選択します。
  2. 「Create / Edit Autoconfiguration File」リンクをクリックします。ユーザーのプロキシシステム上にある自動設定ファイルのリストを示すページが表示されます。自動設定ファイルをクリックすると、それを編集できます。以下の手順では、新しいファイルの作成方法について説明します。
  3. クライアントが自動設定ファイルをプロキシから入手するときに使用するオプションの URI (URL のパス部分) を入力します。たとえば、/ を入力して、プロキシのメインドキュメント (Web サーバーの index.html ファイルのようなもの) となるファイルにクライアントがアクセスできるようにします。これでクライアントは、自動設定ファイルのプロキシにアクセスするときに、ドメイン名のみを使用するようになります。複数の URI を使用して、各 URI に個別の自動設定ファイルを作成することができます。
  4. .pac 拡張子を使用して、自動設定ファイルの名前を入力します。ファイルが 1 つだけの場合は、単に proxy.pac (pac は proxy autoconfiguration の略) という名前にすることもできます。すべての自動設定ファイルは、JavaScript 関数が 1 つ含まれた ASCII テキストファイルです。
  5. 「了解」をクリックします。別のページが表示されます。このページを使用して、自動設定ファイルを作成します。このページ上の項目は、クライアントごとの順序で表示されています。次のような項目があります。
  6. 「Never Go Direct To Remote Server」は、Navigator に対して、常にプロキシを使用するよう指示します。プロキシサーバーが実行されていない場合は、2 番目のプロキシサーバーを使用するように指定できます。
  7. 「Go Direct To Remote Server When」では、特定の状況においてプロキシサーバーをバイパスします。Navigator は、このページに示されたオプションの順序に従って、これらの状況を識別します。
    • 「Connecting To Non-fully Qualified Host Names」では、ユーザーがコンピュータ名のみを指定した場合に、直接サーバーにアクセスするよう Navigator に指示します。たとえば、winternal.mysite.com という内部 Web サーバーが存在する場合、ユーザーが、完全修飾ドメイン名を入力せずに http://winternal とだけ入力することがあります。このような場合、Navigator はプロキシではなく、直接 Web サーバーにアクセスします。
    • 「Connecting To A Host In Domain」では、Navigator が直接アクセスできるドメイン名を 3 つまで指定できます。ドメインを指定する場合は、ドットから始めます。たとえば、.example.com と入力できます。
    • 「Connecting To A Resolvable Host」では、クライアントがホストを解決できる場合、Navigator が直接そのサーバーにアクセスするようにします。このオプションは、通常、DNS がローカル (内部) ホストのみを解決するように設定されている場合に使用します。ローカルネットワークの外側にあるサーバーに接続する場合、クライアントはプロキシサーバーを使用します。

      警告

      上のオプションを選択すると、クライアントはすべての要求について DNS を参照します。このため、クライアント側から見た場合のパフォーマンスに悪影響を及ぼします。パフォーマンスに対する影響を考慮して、このオプションの使用は避けてください。


    • 「Connecting To A Host In Subnet」では、クライアントが特定のサブネット内のサーバーにアクセスする場合、Navigator が直接そのサーバーにアクセスするようにします。このオプションは、ある地域内に組織が多数のサブネットを抱えている場合に便利です。たとえば、1 つのドメイン名を世界中の複数のサブネットに適用していても、各サブネットは特定の地域に固有である企業のような場合です。

      警告

      上のオプションを選択すると、クライアントはすべての要求について DNS を参照します。このため、クライアント側から見た場合のパフォーマンスに悪影響を及ぼします。パフォーマンスに対する影響を考慮して、このオプションの使用は避けてください。


    • 「Except When Connecting To Hosts」では、サーバーに直接アクセスするときのルールに対して例外を指定することができます。たとえば、直接アクセスするドメインとして .example.com と入力した場合、home.example.com にアクセスする例外を作成することができます。この指定によって Navigator は、home.example.com にアクセスするときにはユーザーのプロキシを使用するものの、example.com ドメイン内のその他のサーバーには直接アクセスするようになります。
    • 「Secondary Failover Proxy」では、プロキシサーバーが実行されていない場合に使用する 2 番目のプロキシを指定します。
    • 「Failover Direct」では、プロキシサーバーが実行されていない場合、サーバーに直接アクセスするよう Navigator に指示します。二次フェイルオーバープロキシを指定している場合、Navigator はサーバーに直接アクセスする前に、2 番目のプロキシサーバーへのアクセスを試行します。
  8. 「了解」をクリックして、自動設定ファイルを作成します。このファイルは、ディレクトリ server-root/proxy-serverid/pac に格納されます。ファイルが正常に作成されたことを示す確認メッセージが表示されます。ここまでの手順を繰り返して、必要な数だけ自動設定ファイルを作成します。

自動設定ファイルを作成したら必ず、プロキシサーバーを使用するすべてのユーザーに正しい自動設定ファイルを指定するように指示するか、Navigator のコピーを自分で設定してください。


自動設定ファイルの手動による作成

この節では、自動設定ファイルを手動で作成する方法について説明します。

プロキシ設定ファイルは、クライアントサイド JavaScript を使用して記述されています。各ファイルには、FindProxyForURL という 1 つの JavaScript 関数が含まれています。この関数は、各 URL に対してブラウザが使用するプロキシサーバーがあれば、どれを使用するのかを決定するものです。ブラウザは、JavaScript 関数に、接続先の配信元サーバーのホスト名と、取得しようとしている URL の 2 つのパラメータを送信します。JavaScript 関数は、処理方法を示す値を Navigator に返します。次の節では、関数の構文と考えられる戻り値について説明します。

FindProxyForURL 関数

FindProxyFor URL 関数の構文は次のとおりです。

function FindProxyForURL(url, host)
{
   ...
}

ブラウザがアクセスするすべての URL に対して、url および host パラメータが送られ、次のようにして関数が呼び出されます。

ret = FindProxyForURL(url, host);

url は、ブラウザからアクセスされる完全な URL です。

host は、アクセスされた URL から抽出されるホスト名です。これは便宜上使用しているだけで、:// と最初の : またはそのあとの / の間にある文字列と同じものです。このパラメータにはポート番号は含まれません。ポート番号は必要に応じて URL から抽出できます。

ret (戻り値) は、設定を記述した文字列です。

関数の戻り値

自動設定ファイルには、関数 FindProxyForURL が含まれています。この関数は、クライアントホスト名と、アクセスしている URL をパラメータとして使用します。この関数は、ブラウザに処理方法を指示する 1 つの文字列を返します。この文字列が null の場合は、プロキシは使用されません。この文字列には、表 17-2 に示す構成ブロックを、セミコロンで区切っていくつでも含めることができます。

表 17-2 FindProxyForURL の戻り値 

戻り値

ブラウザの結果のアクション

DIRECT

プロキシを経由せずに、サーバーに直接接続します。

PROXY host:port

指定されたプロキシとポート番号を使用します。複数の値がセミコロンで区切られている場合、最初のプロキシが使用されます。そのプロキシで失敗した場合は、それ以降のプロキシが順に使用されます。

SOCKS host:port

指定された SOCKS サーバーを使用します。複数の値がセミコロンで区切られている場合、最初のプロキシが使用されます。そのプロキシで失敗した場合は、それ以降のプロキシが順に使用されます。

ブラウザは、使用できないプロキシサーバーに遭遇すると、30 分後に以前に応答のなかったプロキシに自動的に再度アクセスします。それでも応答がなければ 1 時間後というように、30 分間隔で再試行します。つまり、プロキシサーバーを一時的にシャットダウンした場合でも、再起動後 30 分以内には、クライアントがプロキシの使用を再開することになります。

すべてのプロキシが停止しており、DIRECT 戻り値が指定されていない場合、ブラウザは、一時的にプロキシを無視して直接接続を試みるかどうかをユーザーに問い合わせます。Navigator は、プロキシを 20 分後に再試行し、さらにまた 20 分後というように、20 分間隔で再試行するかどうかを問い合わせてきます。

次の例では、戻り値は、ポート 8080 上で w3proxy.example.com というプロキシを使用するようにブラウザに指示していますが、このプロキシが使用できない場合、ブラウザはポート 8080 上で proxy1.example.com というプロキシを使用します。

PROXY w3proxy.example.com:8080; PROXY proxy1.example.com:8080

次の例では、一次プロキシは w3proxy.example.com:8080 で、このプロキシが使用できない場合、ブラウザは proxy1.example.com:8080 を使用します。これらのプロキシがどちらも使用できない場合、ブラウザはサーバーに直接アクセスします。さらに 20 分後、ブラウザは最初のプロキシを再試行するかどうかを問い合わせてきます。

PROXY w3proxy.example.com:8080; PROXY proxy1.example.com:8080; DIRECT

JavaScript の関数および環境

JavaScript には、複数の事前定義された関数と環境条件があり、これらはプロキシの処理に役立ちます。これらの関数はそれぞれ、一定の条件が満たされているかどうかをチェックして、true または false の値を返します。ただし、関連するユーティリティー関数は例外で、DNS ホスト名または IP アドレスを返します。メインの FindProxyForURL 関数内でこれらの関数を使用して、ブラウザに送る戻り値を決定することができます。これらの関数の使用に関する考え方は、この章の後半で挙げる例を参照してください。

この節では、それぞれの関数や環境条件について説明します。プロキシとのブラウザ統合に適用される関数と環境変数は、次のとおりです。

ホスト名ベースの関数

関連するユーティリティー関数

URL/ホスト名ベースの条件

時間ベースの条件

ホスト名ベースの関数

ホスト名ベースの関数では、ホスト名または IP アドレスを使用して、使用するプロキシがあれば決定します。

dnsDomainIs(host, domain)

dnsDomainIs() 関数は、URL ホスト名が、指定された DNS ドメインに属しているかどうかを検出します。この関数は、ローカルドメインに対してプロキシを使用しないようにブラウザを設定する場合に役立ちます。「例 1: ローカルホスト以外の全サーバーのプロキシ」「例 2: ファイアウォールの外側にあるローカルサーバーのプロキシ」を参照してください。

この関数は、要求を受け取るプロキシが、URL の属している DNS ドメインに基づいてプロキシのグループから選択される状況において、複数のプロキシを使用して負荷分散をはかる場合にも役立ちます。たとえば、.edu を含む複数の URL をあるプロキシに割り当て、.com を含む複数の URL を別のプロキシに割り当てることで負荷分散をはかる場合、dnsDomainIs() を使用して URL ホスト名を確認することができます。

パラメータ:

host は、URL からのホスト名です。

domain は、ホスト名のテストで照合するドメイン名です。

戻り値:

true または false

例:

次の文は true になります。

dnsDomainIs("www.example.com", ".example.com")

次の文は false になります。

dnsDomainIs("www", ".example.com")
dnsDomainIs("www.mcom.com", ".example.com")

isInNet(host, pattern, mask)

isInNet() 関数を使用すると、URL ホスト名を IP アドレスに解決し、それがマスクによって指定されたサブネットに属しているかどうかをテストすることができます。これは、SOCKS が使用するものと一致する IP アドレスパターンです。「例 4: サブネットへの直接接続」を参照してください。

パラメータ:

host は、DNS ホスト名または IP アドレスです。ホスト名が渡されると、この関数はこれを IP アドレスに解決します。

pattern は、ドット区切り形式の IP アドレスパターンです。

mask は、IP アドレスパターンマスクで、IP アドレスのどの部分をマッチングするのかを指定します。値 0 は無視、値 255 は一致を意味しています。この関数は、ホストの IP アドレスが指定された IP アドレスパターンと一致すると true になります。

戻り値:

true または false

例:

次の文では、ホストの IP アドレスが 198.95.249.79 と完全に一致した場合のみ true になります。
isInNet(host, "198.95.249.79", "255.255.255.255")

次の文では、ホストの IP アドレスが 198.95.*.* と一致した場合のみ true になります。
isInNet(host, "198.95.0.0", "255.255.0.0")

isPlainhost name(host)

isPlainhost name() 関数は、要求された URL のホスト名がプレーンなホスト名なのか完全修飾ドメイン名なのかを検出します。この関数は、Netscape Navigator をローカルサーバーに直接接続させる場合に役立ちます。「例 1: ローカルホスト以外の全サーバーのプロキシ」「例 2: ファイアウォールの外側にあるローカルサーバーのプロキシ」を参照してください。

パラメータ:

host は、ホスト名にドメイン名がない (ドットの付いたセグメントがない) 場合のみの、URL からのホスト名です (ポート番号を除く)。

戻り値:

host がローカルの場合は true、host がリモートの場合は false

例:

isPlainhost name("host")

host が www などの場合は true が返されます。hostwww.example.com などの場合は false が返されます。

isResolvable(host)

ファイアウォールの内側の DNS が内部ホストのみを認識する場合、isResolvable() 関数を使用して、ホスト名がネットワークの内部か外部かをテストすることができます。この関数を使用すると、内部サーバーには直接接続を使用し、外部サーバーに対してのみプロキシを使用するように、ブラウザを設定できます。これは、ファイアウォールの内側の内部ホストが、ほかの内部ホストの DNS ドメイン名は解決できても、外部ホストは一切解決できないサイトで役立ちます。isResolvable() 関数は DNS を参照し、ホスト名を IP アドレスに解決しようとします。「例 3: 未解決のホストのみのプロキシ」を参照してください。

パラメータ:

host は、URL からのホスト名です。これはホスト名の解決を試みて、成功したら true を返します。

戻り値:

ホスト名が解決できたら true、できなければ false

例:

isResolvable("host")

hostwww などで、DNS を介して解決できる場合、この関数は true を返します。

localHostOrDomainIs(host, hostdom)

localHostOrDomainIs() 関数は、完全修飾ドメイン名かプレーンなホスト名のどちらかによってアクセスされる可能性のあるローカルホストを特定します。「例 2: ファイアウォールの外側にあるローカルサーバーのプロキシ」を参照してください。

localHostOrDomainIs() 関数は、ホスト名が指定されたホスト名と完全に一致する場合か、ホスト名の中に非修飾ホスト名と一致するドメイン名部分がない場合に、true を返します。

パラメータ:

host は、URL からのホスト名です。

hostdom は、一致する完全修飾ホスト名です。

戻り値:

true または false

例:

次の文は true (完全一致) です。

localHostOrDomainIs("www.example.com", "www.example.com")

次の文は true (ホスト名は一致、ドメイン名は指定なし) です。

localHostOrDomainIs("www", "www.example.com")

次の文は false (ドメイン名が不一致) です。

localHostOrDomainIs("www.mcom.com", "www.example.com")

次の文は false (ホスト名が不一致) です。

localHostOrDomainIs("home.example.com", "www.example.com")

関連するユーティリティー関数

関連するユーティリティー関数を使用すると、ドメインレベル、Netscape Navigator が実行されているホスト、あるいはホストの IP アドレスを検出することができます。

dnsDomainLevels(host)

dnsDomainLevels() 関数は、URL ホスト名の中の DNS レベルの数 (ドットの数) を検出します。

パラメータ:

host は、URL からのホスト名です。

戻り値:

DNS ドメインレベルの数 (整数)。

例:

dnsDomainLevels("www")

returns 0.

dnsDomainLevels("www.example.com")

returns 2.

dnsResolve(host)

dnsResolve() 関数は、指定されたホスト (通常は URL からのもの) の IP アドレスを解決します。これは、JavaScript 関数が、既存の関数でできるものより高度なパターンマッチングを実行する必要がある場合に役立ちます。

パラメータ:

host は、解決するホスト名です。指定された DNS ホスト名を IP アドレスに解決し、ドット区切り形式の文字列として返します。

戻り値:

ドットの付いた Quad 表記の IP アドレス (文字列値)

例:

次の例では、文字列 198.95.249.79 が返されます。

dnsResolve("home.example.com")

myIpAddress()

myIpAddress() 関数は、ブラウザが実行されているホストによって、JavaScript 関数が異なる動作をする必要のある場合に役立ちます。この関数は、ブラウザを実行しているコンピュータの IP アドレスを返します。

戻り値:

ドットの付いた Quad 表記の IP アドレス (文字列値)

例:

次の例では、コンピュータ home.example.com 上で Navigator を実行している場合に、文字列 198.95.249.79 を返します。

myIpAddress()

URL/ホスト名ベースの条件

負荷分散やルーティングを行うために、ホスト名または URL をマッチングすることができます。

shExpMatch(str, shexp)

shExpMatch() 関数は、URL ホスト名または URL そのものをマッチングします。この関数は主に、負荷を分散して、さまざまなプロキシサーバーに URL をインテリジェントにルーティングする場合に使用します。

パラメータ:

str は、比較対象の文字列です (たとえば、URL またはホスト名)。

shexp は、比較するシェル表現です。

この表現は、文字列が指定されたシェル表現と一致したときに true になります。「例 6: shExpMatch() によるプロキシの負荷分散」を参照してください。

戻り値:

true または false

例:

最初の例は true を返し、2 つ目の例は false を返します。

shExpMatch("http://home.example.com/people/index.html",
            ".*/people/.*")

shExpMatch("http://home.example.com/people/yourpage/index.html",
            ".*/mypage/.*")

時間ベースの条件

日付、時間、または曜日によって、FindProxyForURL 関数が異なる動作をするように設定できます。

dateRange (day, month, year...)

dateRange() 関数は、1996 年 4 月 19 日から 1996 年 5 月 3 日のような、特定の日付や日付範囲を検出します。これは、日付によって FindProxyForURL 関数に異なる動作をさせる場合に役立ちます。たとえば、プロキシの 1 つに対してメンテナンスのための停止時間を定期的にスケジュールするような場合です。

日付の範囲は、次に示すいくつかの方法で指定できます。

dateRange(day)
dateRange(day1, day2)
dateRange(mon)
dateRange(month1, month2)
dateRange(year)
dateRange(year1, year2)
dateRange(day1, month1, day2, month2)
dateRange(month1, year1, month2, year2)
dateRange(day1, month1, year1, day2, month2, year2)
dateRange(day1, month1, year1, day2, month2, year2, gmt)

パラメータ:

day は、月の日付を表す 1 〜 31 までの整数です。

month には、月を表す次のいずれかの文字列が入ります。
JAN FEB MAR APR MAY JUN JUL AUG SEP OCT NOV DEC

year には、西暦を表す 4 桁の整数が入ります (たとえば 1996)。

gmt には、グリニッジ標準時で時間の比較を行う場合は文字列 GMT を指定し、時間を現地時間帯とする場合は空白のままにします。GMT パラメータは、常に最後のパラメータとして、どの呼び出しプロファイル内でも指定できます。1 つの値だけが指定 (日、月、年の各カテゴリから) された場合、この関数は、その指定と一致する日に対してのみ true の値を返します。2 つの値が指定された場合、最初の指定時間から 2 つ目の指定時間までが true になります。

例:

次の文は、ローカル時間帯の各月の最初の日について true になります。
dateRange(1)

次の文は、グリニッジ標準時の各月の最初の日について true になります。
dateRange(1, "GMT")

次の文は、各月の前半について true になります。
dateRange(1, 15)

次の文は、各年の 12 月 24 日について true になります。
dateRange(24, "DEC")

次の文は、1995 年 12 月 24 日について true になります。
dateRange(24, "DEC", 1995)

次の文は、年の第 1 四半期について true になります。
dateRange("JAN", "MAR")

次の文は、各年の 6 月 1 日から 8 月 15 日までについて true になります。
dateRange(1, "JUN", 15, "AUG")

次の文は、1995 年 6 月 1 日から 1995 年 8 月 15 日までについて true になります。
dateRange(1, "JUN", 15, 1995, "AUG", 1995)

次の文は、1995 年 10 月から 1996 年 3 月までについて true になります。
dateRange("OCT", 1995, "MAR", 1996)

次の文は、1995 年全体を通じて true になります。
dateRange(1995)

次の文は、1995 年の始めから 1997 年の終わりまでについて true になります。
dateRange(1995, 1997)

timeRange (hour, minute, second...)

timeRange 関数は、午後 9 時から午前 12 時のような、特定の時間や時間範囲を検出します。これは、時間によって FindProxyForURL 関数に異なる動作をさせる場合に役立ちます。

timeRange(hour)
timeRange(hour1, hour2)
timeRange(hour1, min1, hour2, min2)
timeRange(hour1, min1, sec1, hour2, min2, sec2)

パラメータ:

hour は、0 時から 23 時までの時間です (0 は午前 0 時、23 は午後 11 時)。

min は、0 〜 59 までの分数です。

sec は、0 〜 59 までの秒数です。

gmt は、グリニッジ標準時に対しては文字列 GMT を指定し、現地時間帯の場合は何も指定しません。このパラメータは、各パラメータプロファイルで使用でき、常に最後のパラメータとなります。

戻り値:

true または false

例:

次の文は、正午から午後 1 時までが true になります。
timerange(12, 13)

次の文は、グリニッジ標準時の正午から午後 12 時 59 分までが true になります。
timerange(12, "GMT")

次の文は、午前 9 時から午後 5 時までが true になります。
timerange(9, 17)

次の文は、午前 0 時から午前 0 時の 30 秒後までの間について true になります。
timerange(0, 0, 0, 0, 0, 30)

weekdayRange(wd1, wd2, gmt)

weekdayRange() 関数は、月曜日から金曜日などの、特定の曜日または曜日の範囲を検出します。これは、曜日によって FindProxyForURL 関数に異なる動作をさせる場合に役立ちます。

パラメータ:

wd1wd2 には、曜日を表す次のいずれかの文字列が入ります。
SUN MON TUE WED THU FRI SAT

gmt には、グリニッジ標準時を表す GMT を指定するか、現地時間帯の場合は空白のままにします。

最初のパラメータ wd1 のみが必須です。wd2 または gmt、あるいはその両方とも空白のままにすることができます。

パラメータが 1 つしか指定されていない場合、関数は、パラメータの表す曜日についてのみ true の値を返します。2 つ目のパラメータとして文字列 GMT が指定された場合、時間はグリニッジ標準時と見なされ、それ以外の場合は、現地時間帯と見なされます。

wd1 と wd2 の両方が定義された場合、現在の曜日がこれら 2 つの曜日の間にあれば条件は true になります。両端の曜日も含まれます。この場合、パラメータの順序が重要になります。"MON", "WED" は、月曜日から水曜日までを表しますが、"WED", "MON" は水曜日から次週の月曜日までを表します。

例:

次の例では、月曜日から金曜日までが true です (現地時間帯)。
weekdayRange("MON", "FRI")

次の例では、グリニッジ標準時の月曜日から金曜日までが true です。
weekdayRange("MON", "FRI", "GMT")

次の例では、現地時間の土曜日が true です。
weekdayRange("SAT")

次の例では、グリニッジ標準時の土曜日が true です。
weekdayRange("SAT", "GMT")

次の例では、金曜日から月曜日までが true です (曜日の順序が重要)。
weekdayRange("FRI", "MON")

詳細な例

例 1: ローカルホスト以外の全サーバーのプロキシ

次の例では、Netscape Navigator は、完全修飾されていないすべてのホストと、ローカルドメイン内のホストに直接接続しています。それ以外はすべて w3proxy.example.com:8080 というプロキシを経由します。


プロキシが停止すると、自動的に直接接続に切り替わります。

   function FindProxyForURL(url, host)
   {
       if (isPlainhost name(host) ||
           dnsDomainIs(host, ".example.com") ||
           dnsDomainIs(host, ".mcom.com"))
           return "DIRECT";
       else
           return "PROXY w3proxy.example.com:8080; DIRECT";
   }

 


例 2: ファイアウォールの外側にあるローカルサーバーのプロキシ

次の例は、前の例とよく似ていますが、ここではファイアウォールの外側にあるローカルサーバーに対してプロキシを使用しています。ローカルドメインに属しているが、ファイアウォールの外側にあり、プロキシサーバーを経由しないとアクセスできないホスト (主要な Web サーバーなど) が存在する場合、これらの例外は localHostOrDomainIs() 関数を使用して処理されます。

    function FindProxyForURL(url, host)
    {
        if ((isPlainhost name(host) ||
        dnsDomainIs(host, ".example.com")) &&
        !localHostOrDomainIs(host, "www.example.com") &&
        !localHostOrDoaminIs(host, "merchant.example.com"))
            return "DIRECT";
        else
            return "PROXY w3proxy.example.com:8080; DIRECT";
    }

この例では、example.com ドメイン内のローカルホストを除くすべてに対してプロキシを使用しています。ホスト www.example.commerchant.example.com も、プロキシを経由します。

例外の順序によって効率を上げることができます。localHostOrDomainIs() 関数は、すべての URL に対してではなく、ローカルドメイン内の URL に対してのみ実行されます。特に、and 式の前の or 式を囲む括弧に注意してください。

例 3: 未解決のホストのみのプロキシ

次の例は、内部ホスト名だけを解決できるように内部 DNS が設定されており、解決できないホストに対してのみプロキシを使用することを目的とした環境で機能します。

    function FindProxyForURL(url, host)
    {
        if (isResolvable(host))
                return "DIRECT";
            else
                return "PROXY proxy.mydomain.com:8080";
    }

次の例では、DNS を毎回参照する必要があるので、ほかのルールとグループ化して、ほかのルールで結果が得られない場合のみ DNS を参照するように設定します。

    function FindProxyForURL(url, host)
    {

        if (isPlainhost name(host) ||
            dnsDomainIs(host, ".mydomain.com") ||
            isResolvable(host))
            return "DIRECT";
        else
            return "PROXY proxy.mydomain.com:8080";
    }

例 4: サブネットへの直接接続

次の例では、指定されたサブネット内のホストはすべて直接接続し、それ以外はプロキシを経由します。

    function FindProxyForURL(url, host)
    {
        if (isInNet(host, "198.95.0.0", "255.255.0.0"))
            return "DIRECT";
        else

            return "PROXY proxy.mydomain.com:8080";
    }

この例では、先頭に冗長なルールを追加して、DNS の使用を最小限に抑えることができます。

    function FindProxyForURL(url, host)
    {
        if (isPlainhost name(host) ||
            dnsDomainIs(host, ".mydomain.com") ||
            isInNet(host, "198.95.0.0", "255.255.0.0"))
            return "DIRECT";
        else
            return "PROXY proxy.mydomain.com:8080";
    }

例 5: dnsDomainIs() によるプロキシの負荷分散

次に挙げる例は、より詳細なものです。ここにはプロキシサーバーが 4 台あり、そのうちの 1 台がほかのサーバーに対するホットスタンバイとして機能しています。したがって、ほかの 3 台のサーバーのいずれかが停止したら、4 台目のサーバーが引き継ぎます。ほかの 3 台のプロキシサーバーは URL パターンに基づいて負荷を分散しており、これによってキャッシュが効率的に行われています。3 台のサーバー上のドキュメントはすべてコピーが 1 つしかありません。それぞれに 1 つずつコピーがあるわけではありません。負荷分散は、表 17-3 に示すように行われています。

表 17-3 プロキシの負荷分散

プロキシ

目的

#1

.com ドメイン

#2

.edu ドメイン

#3

ほかのすべてのドメイン

#4

ホットスタンバイ

ローカルアクセスはすべて直接行われる必要があります。プロキシサーバーはすべて、ポート 8080 上で実行されます。JavaScript で + 演算子を使用して、文字列を連結することができます。

function FindProxyForURL(url, host)
{
    if (isPlainhost name(host) || dnsDomainIs(host, ".mydomain.com"))
        return "DIRECT";

    else if (dnsDomainIs(host, ".com"))
        return "PROXY proxy1.mydomain.com:8080; " +
              "PROXY proxy4.mydomain.com:8080";

    else if (dnsDomainIs(host, ".edu"))
        return "PROXY proxy2.mydomain.com:8080; " +
              "PROXY proxy4.mydomain.com:8080";

    else
        return "PROXY proxy3.mydomain.com:8080; " +
              "PROXY proxy4.mydomain.com:8080";
}

例 6: shExpMatch() によるプロキシの負荷分散

次の例は、基本的には例 5 と同じですが、dnsDomainIs() を使用する代わりに、この例では shExpMatch() が使用されています。

    function FindProxyForURL(url, host)
    {

    if (isPlainhost name(host) || dnsDomainIs(host, ".mydomain.com"))
        return "DIRECT";
    else if (shExpMatch(host, "*.com"))
        return "PROXY proxy1.mydomain.com:8080; " +
              "PROXY proxy4.mydomain.com:8080";
    else if (shExpMatch(host, "*.edu"))
        return "PROXY proxy2.mydomain.com:8080; " +
              "PROXY proxy4.mydomain.com:8080";
    else
        return "PROXY proxy3.mydomain.com:8080; " +
              "PROXY proxy4.mydomain.com:8080";
    }

例 7: 固有のプロトコルのプロキシ

固有のプロトコルに対するプロキシを設定できます。標準の JavaScript 機能のほとんどは、FindProxyForURL() 関数で使用できるようになっています。たとえば、プロトコルに基づいて異なるプロキシを設定する場合は、substring() 関数を使用できます。

    function FindProxyForURL(url, host)
    {
        if (url.substring(0, 5) == "http:") {
            return "PROXY http-proxy.mydomain.com:8080";
        }
        else if (url.substring(0, 4) == "ftp:") {
            return "PROXY ftp-proxy.mydomain.com:8080";
        }
        else if (url.substring(0, 7) == "gopher:") {
            return "PROXY gopher-proxy.mydomain.com:8080";
        }
        else if (url.substring(0, 6) == "https:" ||
               url.substring(0, 6) == "snews:") {
            return "PROXY security-proxy.mydomain.com:8080";
        }
        else {
            return "DIRECT";
        }
    }

この処理は、次の例のように、shExpMatch() 関数を使用して実行することもできます。

    ...
    if (shExpMatch(url, "http:*")) {
        return "PROXY http-proxy.mydomain.com:8080;
    }

    ...



前へ      目次      索引      次へ     


Part No: 819-3160.   Copyright 2005 Sun Microsystems, Inc. All rights reserved.