自動プロキシ構成スクリプト (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 になることはありませんが、他のパラメーターでは小文字が使用されます。 インターネット エクスプローラー自体は、関数が呼び出される前に、変数hosturl を小文字にFindProxyForURL変換します。

この条件は に当ては WinHTTPまりません。 これは、 と を関数にurl直接渡hostすからですWinHTTP

したがって、PAC ファイル内でチェックされるパラメーターは、評価される前に PAC 内で変換する必要があります。

host = host.toLowerCase();

IPv6 の使用

IPv6 アドレスを使用して処理する場合、インターネット エクスプローラーは、現在サポートされているすべての Windows バージョン (および Windows Vista 以降の WinHTTP) にインターネット エクスプローラーが含まれているため、それらをサポートします。 ただし、この場合は、次の記事で説明するように、"Ex" 関数 (など isInNetEx()) を使用する必要があります。

IPv6 対応プロキシ ヘルパー API 定義

実装の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 は、第三者の連絡先情報の正確性を保証しません。