この節では、JavaScript 関数の詳細な例を説明します。
次の例では、ブラウザは、完全修飾されていないすべてのホストと、ローカルドメイン内のホストに直接接続しています。それ以外はすべて 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"; }
この例は「例 1: ローカルホスト以外の全サーバーのプロキシ」とよく似ていますが、ここではファイアウォールの外側にあるローカルサーバーに対してプロキシを使用しています。ローカルドメインに属しているが、ファイアウォールの外側にあり、プロキシサーバーを経由しないとアクセスできないホスト (主要な 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.com と merchant.example.com も、プロキシを経由します。
例外の順序によって効率を上げることができます。localHostOrDomainIs() () 関数は、すべての URL に対してではなく、ローカルドメイン内の URL に対してのみ実行されます。特に、and 式の前の or 式を囲む括弧に注意してください。
この例は、内部ホスト名だけを解決できるように内部 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"; }
この例では、指定されたサブネット内のホストはすべて直接接続し、それ以外はプロキシを経由します。
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"; }
次に挙げる例は、より詳細なものです。ここにはプロキシサーバーが 4 台あり、そのうちの 1 台がほかのサーバーに対するホットスタンバイとして機能しています。したがって、ほかの 3 台のサーバーのいずれかが停止したら、4 台目のサーバーが引き継ぎます。ほかの 3 台のプロキシサーバーは URL パターンに基づいて負荷を分散しており、これによってキャッシュが効率的に行われています。3 台のサーバー上のドキュメントはすべてコピーが 1 つしかありません。それぞれに 1 つずつコピーがあるわけではありません。負荷分散は、次の表に示すように行われています。
表 17–3 プロキシの負荷分散
プロキシ (Proxy) |
目的 |
---|---|
#1 |
.com ドメイン |
#2 |
.edu ドメイン |
#3 |
ほかのすべてのドメイン |
#4 |
ホットスタンバイ |
ローカルアクセスはすべて直接行われる必要があります。プロキシサーバーはすべて、ポート 8080 上で実行されます。+ 演算子を使用して、文字列を連結することができます。
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"; }
この例は、基本的には 「例 5: dnsDomainIs()() によるプロキシの負荷分散」と同じですが、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"; }
固有のプロトコルに対するプロキシを設定できます。標準の 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; } ...