NetscapeのProxy autoconfigの 記述方法

Netscape ブラウザは、Proxy サーバの選択を柔軟に行うために、JavaScript を使って Proxy サーバの選択ルールを記述することができます。


FindProxyForURL(url, host)

このルールは設定ファイルの形でサーバもしくは、ローカルに置く必要があり ます。この設定ファイルは、次の関数を定義することによって、サーバのアク セス方法を制御します。

FindProxyForURL(url, host);
url アクセスするサーバのフルURL
(protocol://hostname:port/patdname?search)
host URLから得られるホスト名 (hostname のみ)

FindProxyForURL()関数は、ルールの評価結果を次の文字列で返すこ とになります。

DIRECT Proxy サーバを使用せず、直接接続する
PROXY host:port 指定された Proxy サーバが使用する
SOCKS host:port 指定されたSOCKSサーバが使用する

なお、上記結果は下記のように ";" で結果を続ける事ができます。 もし、複数設定されていれば、ナビゲータは Proxy 接続が確立するまで、左 の設定順で接続が試みられます。

接続が試みられる順番 →
PROXY proxy1.foo.co.jp; PROXY proxy2.foo.co.jp
ナビゲータは自動的に30分後、前回応答がなかったProxyサーバに再接続を行 い、更にまた、1時間後に再接続します (30分 毎に再接続が続けられます)。

全ての Proxyサーバがダウンしていて、DIRECTが指定されていない 場合、ナビゲータは Proxy を一時的に無視にして、直接接続を試みるかをユー ザに尋ねます。ナビゲータは、20分経過した後に Proxy が 再接続するかどう かをユーザに尋ね、接続できなければ、更にまた40分後に尋ねます (20分毎に 尋ねます)。

例:

PROXY proxy1.foo.co.jp:8080; PROXY proxy2.foo.co.jp:8000
proxy1:8080 が主サーバで、ダウンもしくは接続できない場 合、主サーバが再接続できるまで proxy2:8000が使用されま す。

PROXY proxy1.foo.co.jp:8080; PROXY proxy2.foo.co.jp:8000; DIRECT
上記と同じで、両方のサーバがダウンしていた場合、直接接続を試み ます。
(最初の例では、両方のサーバがダウンしていた場合、直接接続するか を尋ねられます。)

PROXY proxy1.foo.co.jp; SOCKS socks.foo.co.jp:1080
主PROXYサーバがダウンしていた場合、SOCKSサーバを使用します。


設定ファイルの置き方

まず、サーバ側で後で説明する JavaScript 関数を使って、 "なんとか.pac" というファイル名で設定ファイルを作成します。こ の設定ファイルは MIME タイプ "application/x-ns-proxy-autoconfig" を使って送り込みます。 NCSA httpd サーバの場合、 mime.type に以下の行を書き込みます。

application/x-ns-proxy-autoconfig        pac
ナビゲータ側では、"Network Preferences" の "Proxy"ウィン ドウの"Automatic Proxy Configuraion"を選択します。 Location(URL) には、先程の Proxy 設定ファイルのURLを書き込み、 Reloadボタンを押して、設定をロードします。これで完了です。

クラアイント側に置く場合、"Automatic Proxy Configuraion"の Location(URL) に、Proxy設定ファイルのURL ("file:/pathname/proxy.pac") を書き込み、Reloadボタン を押して、設定をロードします。これで完了です。


設定ファイルの記述方法

設定ファイルは、ある条件の時にクライアントは、直接接続を行うか、どの Proxyサーバ、Socksサーバを選択するかを記述していきます。従って、ファイ ルの基本骨格は次のようになります。

function FindProxyForURL(url, host)
{
          if 条件
                    return DIRECT または PROXY または SOCKS
          else if 条件
                    return DIRECT または PROXY または SOCKS
          :
          :
          else
                    return DIRECT または PROXY または SOCKS
}

JavaScript関数


isPlainHostName(host)

host
URL から得られるホスト名です(ポート番号は除く)。
ホスト名にはドメイン名がない場合、真を返します。

例:

isPlainHostName(host)とした時、URLから得られるホスト名に対し て、

となります。


dnsDomainIs(host, domain)

host
URLから得られるホスト名です。
domain
評価するドメイン名
ホストのドメイン名が一致している場合、真を返します。

例:

dnsDomainIs(host, ".foo.co.jp")とした時、URLから得られるホス ト名に対して、


localHostOrDomainIs(host, hostdom)

host
URLから得られるホスト名です。
hostdom
評価する Fully Qualified ホスト名
ホスト名が確実に指定されたホスト名に一致している場合、または、ホスト名 にドメイン名部がない場合、真を返します。

例:

localHostOrDomainIs(host, "www.foo.co.jp")とした時、URLから得 られるホスト名に対して、


isResolvable(host)

host
URLから得られるホスト名です。
ホスト名がDNS的に解決できる場合、真を返します。

例:

isResolvable("www.foo.co.jp")
真 (DNS的に解決できれば)
isResolvable("bogus.domain.foobar")

isInNet(host, pattern, mask)

host
DNS的ホスト名、IPアドレスです。
pattern
IPアドレスパターン
mask
一致するアドレス範囲を決定するためのマスクビット
ホストのIPアドレスが指定されたIPアドレスパターンと一致する場合、真を返 します。

例:

isInNet(host, "192.26.91.3", "255.255.255.255")
ホストが確実に192.26.91.3と一致すれば、真を返します。
isInNet(host, "192.26.0.0", "255.255.0.0")
ホストのIPアドレスが 192.26.*.* であれば、真を返します。

dnsResolve(host)

host
解決するホスト名です。
与えられたDNSホスト名のIPアドレスを返します。

例:

dnsResolve("host")host"w3.lab.kdd.co.jp" の時、"192.26.91.3"を返します。


myIpAddress()

Netscape ナビゲータが動作しているホストのIPアドレスを返します。

例:

myIpAddress()
Netscapeナビゲータが動作するホストのIPアドレス "192.168.100.103" を返します。

dnsDomainLevels(host)

host
URLから得られるホスト名です。
ホスト名のDNSドメインレベル(ドットの数)の数を返します。

例:

dnsDomainLevels(host)とした時、URLから得られるホスト名に対し て、


shExpMatch(str, shexp)

str
比較したい任意の文字列 (例えば、URL、ホスト名等)
shexp
比較するシェル表現(メタキャラクタ)
文字列が指定されたシェル表現と一致する場合、真を返します (パターンはシェ ル表現で、正規表現ではありません)。

例:

url"http://www.foo.co.jp/people/yoo/index.html" であれば、


weekdayRange(wd1, wd2, gmt)

wd1wd2
週の曜日、SUN(日曜日)、MON(月曜日)、 TUE(火曜日)、WED(水曜日)、THU(木曜日)、 FRI(金曜日)、SAT(土曜日)
gmt
GMT または 無し
第一パラメータ(wd1)は必須です。第二、第三パラメータは指定しな くても構いません。

第一パラメターのみの場合、指定したローカルタイムゾーンを使用した曜日の 時間を返します。第二パラメータが "GMT" の場合、GMTタイムゾー ンを使用した曜日の時間を返します。

第二パラメータが曜日の場合、現在の曜日が第一パラメータと第二パラメータ の曜日の中であれば、真を返します。"GMT" が付いている場合、GMT タイムゾーンを使用します。

例:

weekdayRange("MON", "FRI")
現曜日が月曜日から金曜日の範囲であれば、真を返します。(ローカル タイムゾーン)
weekdayRange("MON", "FRI", "GMT")
現曜日が月曜日から金曜日の範囲であれば、真を返します。(GMTタイ ムゾーン)
weekdayRange("SAT")
土曜日のローカル時間を返します。
weekdayRange("SAT", "GMT")
土曜日のGMT時間を返します。
weekdayRange("FRI", "MON")
現曜日が金曜日から月曜日の範囲であれば、真を返します。(すなわち 金、土、日、月曜日)

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

day
1〜31迄の日付。
month
月名、JAN(1月)、FEB(2月)、MAR(3月)、 APR(4月)、MAY(5月)、JUN(6月)、 JUL(7月)、AUG(8月)、SEP(9月)、 OCT(10月)、NOV(11月)、DEC(12月)。
year
西暦 (例えば、1996)
gmt
GMT (GMTタイムゾーン)または無しの場合はローカルタイムゾーン (JST)を使用します
パラメータが一つ(日、月、年)の場合、その日と一致すれば、真を返します。 また、範囲を表す場合、その日が範囲内にあれば、真を返します。

例:

dateRange(1)
その日が1日ならば、真を返します。
dateRange(1, "GMT")
その日が1日(GMTタイムゾーン)ならば、真を返します。
dateRange(1, 15)
その日が1 〜 15 日の間ならば、真を返します。
dateRange(24, "DEC")
その日が12月24日ならば、真を返します。
dateRange(24, "DEC", 1995)
その日が1995年12月24日ならば、真を返します。
dateRange("JAN", "MAR")
その日が1月1日〜3月31日の範囲にあれば、真を返します。
dateRange(1, "JUN", 15, "AUG")
その日が6月1日〜8月15日の範囲にあれば、真を返します。
dateRange(1, "JUN", 1995, 15, "AUG", 1995)
その日が1995年6月1日〜1995年8月15日の範囲にあれば、真を返します。
dateRange("OCT", 1995, "MAR", 1996)
その日が1995年10月1日〜1996年3月31日の範囲にあれば、真を返します。
dateRange(1995)
その日が1995年であれば、真を返します。
dateRange(1995, 1997)
その日が1995年〜1997年であれば、真を返します。

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

hour
0〜23時。
min
0〜59分
sec
0〜59秒
gmt
GMT (GMTタイムゾーン)または無しの場合はローカルタイムゾーン (JST)を使用します
指定された時間また、時間の範囲であれば、真を返します。 例:

timeRange(12)
その時間が午後0時〜午後1時の間であれば、真を返します。
timeRange(12, 13)
上記と同じ
timeRange(12, "GMT")
その時間がGMTタイムゾーンの午後0時〜午後1時の間であれば、真を返 します。
timeRange(9, 17)
午前9時〜午後5時の間であれば、真を返します。
timeRange(8, 30, 17, 00)
午前8:30〜午後5:00の間であれば、真を返します。
timeRange(0, 0, 0, 0, 0, 30)
午前0時0分0秒から30秒後の間であれば、真を返します。

例1

下記の例は、アクセスしたいWWWサーバのホスト名が host という名 前、host.foo.co.jp または、host.fee.co.jp であれば、 直接接続を行ない、それ以外は、PROXY サーバ proxy.foo.co.jp ポー ト番号8080を使用します。そして、PROXYサーバがダウンしていた場合は、直 接WWWサーバに接続します。

function FindProxyForURL(url, host)
{
    if (isPlainHostName(host) ||
        dnsDomainIs(host, ".foo.co.jp") ||
        dnsDomainIs(host, ".fee.co.jp"))
        return "DIRECT";
    else
        return "PROXY proxy.foo.co.jp:8080; DIRECT";
}

例2

下記の例は、アクセスしたいWWWサーバのホスト hostがDNS解決でき れば直接接続し、できなければ、PROXY サーバを使用します。
function FindProxyForURL(url, host)
{
    if (isResolvable(host))
        return "DIRECT";
    else
        return "PROXY proxy.foo.co.jp:8080";
}
DNSが動いていない時にも有効なようにしている。
function FindProxyForURL(url, host)
{
    if (isPlainHostName(host) ||
        dnsDomainIs(host, ".foo.co.jp") ||
        isResolvable(host))
        return "DIRECT";
    else
        return "PROXY proxy.foo.co.jp:8080";
}

例3

下記の例はWWWサーバホストが 192.168.*.* にあれば直接接続し、なければ PROXY サーバを使用します。

function FindProxyForURL(url, host)
{
    if (isInNet(host, "192.168.0.0", "255.255.0.0"))
        return "DIRECT";
    else
        return "PROXY proxy.foo.co.jp:8080";
}
下記はDNSが動いていない時にも大丈夫なようにした例です。

function FindProxyForURL(url, host)
{
    if (isPlainHostName(host) ||
        dnsDomainIs(host, ".foo.co.jp") ||
        isInNet(host, "192.168.0.0", "255.255.0.0"))
        return "DIRECT";
    else
        return "PROXY proxy.foo.co.jp:8080";
}

例4

下記は目的によって PROXYサーバを分けて使用する例です。

Proxyサーバ アクセスしたいWWWサーバのホスト
proxy1 .jpドメイン
proxy2 .comドメイン
proxy3
proxy4 バックアップ

"+" は JavaScript の演算子で、文字列をコンカチネートします。

function FindProxyForURL(url, host)
{
    if (isPlainHostName(host) || dnsDomainIs(host, ".foo.co.jp"))
        return "DIRECT";
    else if (shExpMatch(host, "*.jp"))
        return "PROXY proxy1.foo.co.jp:8080; " +
               "PROXY proxy4.foo.co.jp:8080";
    else if (shExpMatch(host, "*.com"))
        return "PROXY proxy2.foo.co.jp:8080; " +
               "PROXY proxy4.foo.co.jp:8080";
    else
        return "PROXY proxy3.foo.co.jp:8080; " +
               "PROXY proxy4.foo.co.jp:8080";
}

例5

下記の例はWWWクライアントホストに応じてProxyサーバを変える例です。 WWWクライアントホストが 192.168.1.* にあれば、Proxyサーバ "proxy1.foo.co.jp:8080"を利用し、192.168.2.* にあれば、Proxyサーバ "proxy2.foo.co.jp:8080"を利用し、それ以外の場合は直接接続とします。

function FindProxyForURL(url, host)
{
    if (isInNet(myIpAddress(), "192.168.1.0", "255.255.255.0"))
        return "PROXY proxy1.foo.co.jp:8080";
    else if (isInNet(myIpAddress(), "192.168.2.0", "255.255.255.0"))
        return "PROXY proxy2.foo.co.jp:8080";
    else
        return "DIRECT";
}

例6

下記の例は、JavaScript の substring()メソッドを使って、プロトコル別のProxyサーバを 選択する例です。

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;
}
...

ヒント


参考文献


[戻る]