自動プロキシ構成スクリプト (PAC) を使用したパフォーマンスの最適化
警告
廃止され、サポート対象外となった Internet Explorer 11 デスクトップ アプリケーションは、特定のバージョンの Windows 10 で Microsoft Edge の更新プログラムを通じて完全に無効になります。 詳細については、「Internet Explorer 11 デスクトップ アプリの廃止に関する FAQ」をご覧ください。
このトピックでは、自動プロキシ構成スクリプト (PAC ファイル (Wpad.dat とも呼ばれます) のパフォーマンスを最適化する方法について説明します。 このドキュメントでは、イントラネット サーバーに関する問題を直接解決する方法と、プロキシ サーバー経由の外部内部トラフィックを解決する方法について説明します。
アドレス (URL またはホスト名) の評価に使用される関数の詳細については、「 IEAK 11 でプロキシ自動構成 (.pac) ファイルを使用する」を参照してください。
注:
、isResolvable()
、および dnsResolve()
関数はisInNet()
、DNS サブシステムにクエリを送信します。 そのため、これらの関数の使用を回避するか、少なくとも最小限に抑える必要があります。
NetBIOS 名のクエリ
NetBIOS 名 (ピリオドを含まないサーバー名) はイントラネットでのみ使用され、プロキシ経由でルーティングされません。
if (isPlainHostName(host))
return "DIRECT";
内部 DNS サフィックスのクエリ
内部で使用される DNS ゾーンは、通常、直接ルーティングされます。 このようなホストを特定する最も簡単な方法は、 関数を dnsDomainis
使用することです。
if (dnsDomainIs(host, ".dns.company.com"))
return "DIRECT";
を使用 ShExMatch()
すると、同じ結果に対する別の方法とより高速な方法を取得できます。 この関数は、文字列の比較を行います。 同じ結果が返されますが、ワイルドカード文字としてアスタリスク (*) が追加されます。
if (shExpMatch(host, "*.dns.company.com"))
return "DIRECT";
IP 範囲のクエリ
ホストの IP アドレスが Web サーバー名に関係なくローカル イントラネットに属している場合は、プロキシをバイパスして直接移動する必要があります。
IP アドレスがアドレス バーに直接入力されている場合は、もう一度解決する必要はありません。 次のコードを使用して、ホストが既に IP アドレス形式であるかどうかをチェックできます。
var isIpV4Addr = /^(\d+.){3}\d+$/;
ret = isIpV4Addr.test(host);
このコードは、変数ホストにピリオドが続く 3 つの数字が含まれているかどうかを確認し、その後に別の数字を付けます。 その後、結果が変数戻り値に渡されます。 IP の場合は "true"、それ以外の場合は "false" になります。
次のコード スニペットでは、変数ホスト IP に、今後のチェックで使用する IP アドレスが含まれています。
var hostIP;
var isIpV4Addr = /^(\d+.){3}\d+$/;
if (isIpV4Addr.test(host))
hostIP = host;
else
hostIP = dnsResolve(host);
既存以外のホストが関数に渡されると (たとえば、ユーザーがアドレス バーに間違ったことを入力した場合など)、ホスト IP が 0 になる可能性があります。 追加のエラー処理はプロキシによって実行されます。
if (hostIP==0)
return "PROXY myproxy:80";
ホストの IP アドレスがあるため、内部 IP 範囲を確認する必要があります。
可能な限り、 の代わりに isInNet
関数をshExpMatch
使用します。 次のコード スニペットの結果は同じですが、実行速度は shExpMatch
速くなります。
if (isInNet(hostIP, "95.53.0.0", "255.255.0.0"))
return "DIRECT";
if (shExpMatch(hostIP, "95.53.*"))
return "DIRECT";
JavaScript では大文字と小文字が区別されます
プロキシ スクリプトは JavaScript 言語を使用します。 JavaScript では大文字と小文字が区別されます。 したがって、大文字の if
句は true になることはありませんが、他のパラメーターでは小文字が使用されます。 インターネット エクスプローラー自体は、関数が呼び出される前に、変数host
と url
を小文字にFindProxyForURL
変換します。
この条件は に当ては WinHTTP
まりません。 これは、 と を関数にurl
直接渡host
すからですWinHTTP
。
したがって、PAC ファイル内でチェックされるパラメーターは、評価される前に PAC 内で変換する必要があります。
host = host.toLowerCase();
IPv6 の使用
IPv6 アドレスを使用して処理する場合、インターネット エクスプローラーは、現在サポートされているすべての Windows バージョン (および Windows Vista 以降の WinHTTP) にインターネット エクスプローラーが含まれているため、それらをサポートします。 ただし、この場合は、次の記事で説明するように、"Ex" 関数 (など isInNetEx()
) を使用する必要があります。
実装のmyIpAddressEx
例については、「myIpAddress」関数がインターネット エクスプローラー 9 で正しくない結果を返すを参照してください。
PAC ファイルのテスト
スクリプトに構文エラー (たとえば、ステートメントに if
")" 文字が含まれている場合、スクリプトは実行されません。 エラーを最小限に抑えるには、構文チェックを実行するスクリプト エディターの使用を検討してください。 Visual Studio を使用すると、編集中に PAC ファイルの拡張子を ".js" に変更できますが、Web サーバーにアップロードする前に名前を ".pac" に戻すことができます。
注:
Windows 10以降、ファイル ベースの PAC ファイルを使用できなくなります。 詳細については、次の記事を参照してください。
Autoprox.exe を使用したテスト
Web サイトにアクセスできない場合でも、PAC ファイルをテストする必要がある場合があります。 これを行うには、 Autoprox.exe コマンド ライン ツールを使用します。
追加のパラメーターを使用せずにコマンド内でツールを開くと、ヘルプを含む次の出力が返されます。
C:\temp>autoprox
Help for AUTOPROX.EXE
Version : 2.44 (12/16/2019)
Usage : AUTOPROX -a (calling DetectAutoProxyUrl and saving wpad.dat file in temporary file if success)
Usage : AUTOPROX -n (calling DetectAutoProxyUrl with PROXY_AUTO_DETECT_TYPE_DNS_A only and saving wpad.dat file in temporary file if success)
Usage : AUTOPROX [-o] [-d] [-v] [-u:url] [-p:Path to autoproxy file] [-i:IP address]
-o: calls InternetInitializeAutoProxyDll with helper functions implemented in AUTOPROX
-i:IP Address: calls InternetInitializeAutoProxyDll with helper functions implemented in AUTOPROX and using provided IP Address
-v: verbose output for helper functions
For debugging: -d plus HKEY_CURRENT_USER\Software\Microsoft\Windows Script\Settings\JITDebug=1
AUTOPROX -u:url: calling DetectAutoProxyUrl and using autoproxy file to find the proxy for the url
AUTOPROX -u:url -p:path: using the autoproxy file/url from the path to find proxy for the url
Example: autoprox http://www.microsoft.com -> calling DetectAutoProxyUrl and using WPAD if found
Example: autoprox -o -u:http://www.microsoft.com -p:c:\inetpub\wwwroot\wpad.dat
Example: autoprox -u:http://www.microsoft.com -p:http://proxy/wpad.dat
Example: autoprox -d -u:http://www.microsoft.com -p:http://proxy/wpad.dat
サンプルを使用している場合の出力を次に示します。
C:\temp>autoprox -u:https://us.msn.com -p:c:\temp\sample.pac
Searching proxy for url : https://us.msn.com
Searching proxy using file : c:\temp\sample.pac
The Winsock 2.2 dll was found okay
Calling InternetInitializeAutoProxyDll with c:\temp\sample.pac
Calling InternetGetProxyInfo for url https://us.msn.com and host us.msn.com
Proxy returned for url https://us.msn.com is:
PROXY myproxy:80;
Autoprox.exe でのエラー処理
PAC ファイルに構文エラーが含まれている場合は、次のメッセージが表示されます。
ERROR: InternetGetProxyInfo がエラー番号 1003 0x3eb失敗しました。
ローカル テストが完了したら、PAC ファイルを HTTP プロトコルを介してアクセスする Web サーバーにコピーする必要があります。
例:
function FindProxyForURL(url, host) {
// NetBIOS-names
if (isPlainHostName(host))
return "DIRECT";
// change to lower case, if not already been done
host = host.toLowerCase();
// internal DNS-suffixes
if (shExpMatch(host, "*.corp.company.com") ||
shExpMatch(host, "*.dns.company.com"))
return "DIRECT";
// Save the IP-address to variable hostIP
var hostIP;
var isIpV4Addr = /^(\d+.){3}\d+$/;
if (isIpV4Addr.test(host))
hostIP = host;
else
hostIP = dnsResolve(host);
// IP could not be determined -> go to proxy
if (hostIP == 0)
return "PROXY myproxy:80";
// These 3 scopes are used only internally
if (shExpMatch(hostIP, "95.53.*") ||
shExpMatch(hostIP, "192.168.*") ||
shExpMatch(hostIP, "127.0.0.1"))
return "DIRECT";
// Eveything else goes through the proxy
return "PROXY myproxy:80;";
}
サードパーティのお問い合わせ窓口に関する免責事項
Microsoft では、このトピックに関する追加情報を見つけるのに役立つサード パーティの連絡先情報を提供しています。 将来予告なしに変更されることがあります。 Microsoft は、第三者の連絡先情報の正確性を保証しません。
フィードバック
https://aka.ms/ContentUserFeedback」を参照してください。
以下は間もなく提供いたします。2024 年を通じて、コンテンツのフィードバック メカニズムとして GitHub の issue を段階的に廃止し、新しいフィードバック システムに置き換えます。 詳細については、「フィードバックの送信と表示