次の方法で共有


自動プロキシ構成スクリプト (PAC) を使用したパフォーマンスの最適化

警告

廃止され、サポート対象外となった Internet Explorer 11 デスクトップ アプリケーションは、特定のバージョンの Windows 10 で Microsoft Edge の更新プログラムを通じて完全に無効になります。 詳細については、「Internet Explorer 11 デスクトップ アプリの廃止に関する FAQ」をご覧ください。

このトピックでは、自動プロキシ構成スクリプト (PAC ファイル、Wpad.dat とも呼ばれます) のパフォーマンスを最適化する方法について説明します。 このドキュメントでは、イントラネット サーバーに関する問題を直接解決する方法と、プロキシ サーバー経由の外部内部トラフィックを解決する方法について説明します。

アドレス (URL またはホスト名) の評価に使用される関数の詳細については、「 IEAK 11 でプロキシ自動構成 (.pac) ファイルを使用するを参照してください。

Note

isInNet()isResolvable()、およびdnsResolve()関数は、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 になることはありませんが、他のパラメーターでは小文字が使用されます。 Internet Explorer 自体は、FindProxyForURL関数が呼び出される前に、変数hosturlを小文字に変換します。

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

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

host = host.toLowerCase();

IPv6 を使用する

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

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

myIpAddressEx実装の例については、「myIpAddress」関数 Internet Explorer 9 で正しくない結果が返されるを参照してください。

PAC ファイルのテスト

スクリプトに構文エラー (たとえば、 if ステートメントに ")" 文字が含まれている場合、スクリプトは実行されません。 エラーを最小限に抑えるには、構文チェックを実行するスクリプト エディターの使用を検討してください。 Visual Studio を使用すると、編集中に PAC ファイルの拡張子の名前を ".js" に変更できますが、Web サーバーにアップロードする前に名前を ".pac" に戻すことができます。

Note

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 ファイルに構文エラーが含まれている場合は、次のメッセージが表示されます。

エラー: InternetGetProxyInfo がエラー番号 0x3eb 1003 で失敗しました。

ローカル テストが完了したら、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 では、サード パーティの連絡先情報が正確であることを保証していません。