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関数
- ホスト名関連関数
- ユーティリティ関数
- URL/ホスト名関連関数
- 時刻関連関数
-
isPlainHostName(host)
- host
- URL から得られるホスト名です(ポート番号は除く)。
ホスト名にはドメイン名がない場合、真を返します。
例:
isPlainHostName(host)とした時、URLから得られるホスト名に対し
て、
- host が "www" なら真
- host が "www.foo.co.jp" なら偽
となります。
dnsDomainIs(host, domain)
- host
- URLから得られるホスト名です。
- domain
- 評価するドメイン名
ホストのドメイン名が一致している場合、真を返します。
例:
dnsDomainIs(host, ".foo.co.jp")とした時、URLから得られるホス
ト名に対して、
- host が "www.foo.co.jp" なら真
- host が "www" なら偽
- host が "www.fee.co.jp" なら偽
localHostOrDomainIs(host, hostdom)
- host
- URLから得られるホスト名です。
- hostdom
- 評価する Fully Qualified ホスト名
ホスト名が確実に指定されたホスト名に一致している場合、または、ホスト名
にドメイン名部がない場合、真を返します。
例:
localHostOrDomainIs(host, "www.foo.co.jp")とした時、URLから得
られるホスト名に対して、
- host が "www.foo.co.jp" なら真 (確実に一致)
- host が "www" なら真 (ホスト名が一致、ドメイ
ン名指定無し)
- host が "www.fee.co.jp" なら偽 (ドメイン名が
不一致)
- host が "home.foo.co.jp" なら真 (ホスト名が不
一致)
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から得られるホスト名に対し
て、
- host が "www" の時、0を返します。
- host が "www.foo.co.jp" の時、3を返します。
shExpMatch(str, shexp)
- str
- 比較したい任意の文字列 (例えば、URL、ホスト名等)
- shexp
- 比較するシェル表現(メタキャラクタ)
文字列が指定されたシェル表現と一致する場合、真を返します (パターンはシェ
ル表現で、正規表現ではありません)。
例:
url が "http://www.foo.co.jp/people/yoo/index.html"
であれば、
- shExpMatch(url, "*/yoo/*")の時、真を返します
- shExpMatch(url, "*/hoo/*")の時、偽を返します。
weekdayRange(wd1, wd2, gmt)
- wd1 と wd2
- 週の曜日、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;
}
...
ヒント
- 設定ファイルは CGI スクリプトの出力を利用すると、より便利になる
でしょう。
- isInNet()、isResolvable()や
dnsResove()関数は、DNS 機能が必要です。そのため、DNS
サーバに接続できないと Proxy サーバが利用できなくなってしまいま
す。例えば、自分のホストがDNSサーバになったり、ProxyサーバをDNS
サーバにできれば、二つのサーバを気にしなくてもよくなるのではな
いでしょうか (しかし、それほどナイーブにならなくてもいいと思い
ます)。
参考文献
[戻る]