Optimieren der Leistung mit automatischen Proxykonfigurationsskripts (PAC)

Warnung

Die eingestellte, nicht mehr unterstützte Desktop-Anwendung Internet Explorer 11 wurde durch ein Microsoft Edge-Update in bestimmten Versionen von Windows 10 dauerhaft deaktiviert. Weitere Informationen finden Sie unter Häufig gestellte Fragen zur Einstellung der Desktop-App von Internet Explorer 11.

In diesem Thema wird erläutert, wie Sie die Leistung eines skripts für die automatische Proxykonfiguration (PAC-Datei, auch bekannt als Wpad.dat) optimieren. Dieses Dokument konzentriert sich auf die Behebung von Problemen mit den Intranetservern direkt und externen internen Datenverkehr über einen Proxyserver.

Weitere Informationen zu den Funktionen, die zum Auswerten einer Adresse (URL oder Hostname) verwendet werden, finden Sie unter Verwenden von Proxy-Autokonfigurationsdateien (.pac) mit IEAK 11.

Hinweis

Die isInNet()Funktionen , isResolvable()und dnsResolve() senden Abfragen an das DNS-Subsystem. Daher sollten Sie die Verwendung dieser Funktionen vermeiden oder zumindest minimieren.

Abfragen von NetBIOS-Namen

NetBIOS-Namen (Servernamen, die keinen Punkt enthalten) werden nur im Intranet verwendet und nicht über den Proxy weitergeleitet:

if (isPlainHostName(host))
    return "DIRECT";

Abfragen interner DNS-Suffixe

Intern verwendete DNS-Zonen werden in der Regel direkt weitergeleitet. Die einfachste Möglichkeit, solche Hosts zu ermitteln, ist die Verwendung der dnsDomainis -Funktion:

if (dnsDomainIs(host, ".dns.company.com"))
    return "DIRECT";

Eine alternative und schnellere Methode für dasselbe Ergebnis kann mithilfe ShExMatch()von abgerufen werden. Diese Funktion führt einen Zeichenfolgenvergleich durch. Es gibt das gleiche Ergebnis zurück, fügt aber ein Sternchen (*) als Platzhalterzeichen hinzu:

if (shExpMatch(host, "*.dns.company.com"))
    return "DIRECT";

Abfragen von IP-Bereichen

Wenn die IP-Adresse des Hosts zum lokalen Intranet gehört, sollte er unabhängig vom Webservernamen den Proxy umgehen, um direkt zu navigieren.

Wenn die IP-Adresse direkt in die Adressleiste eingegeben wird, müssen Sie sie nicht erneut auflösen. Sie können den folgenden Code verwenden, um zu überprüfen, ob der Host bereits das IP-Adressformat aufweist:

var isIpV4Addr = /^(\d+.){3}\d+$/;
  ret = isIpV4Addr.test(host);

Dieser Code überprüft, ob der Variablenhost drei Ziffern enthält, auf die ein Punkt und dann eine weitere Zahl folgt. Das Ergebnis wird dann an die Variablenrückgabe übergeben. Das Ergebnis ist "true" für eine IP und andernfalls "false".

Im folgenden Codeausschnitt enthält die Host-IP-Adresse der Variablen die IP-Adresse für zukünftige Überprüfungen:

var hostIP;
var isIpV4Addr = /^(\d+.){3}\d+$/;
if (isIpV4Addr.test(host))
    hostIP = host;
else
    hostIP = dnsResolve(host);

Wenn ein nicht vorhandener Host an die Funktion übergeben wird (z. B. wenn der Benutzer etwas falsches in die Adressleiste eingegeben hat), kann das Ergebnis in der Host-IP-Adresse null sein. Alle zusätzlichen Fehlerbehandlungen werden vom Proxy durchgeführt:

if (hostIP==0)
    return "PROXY myproxy:80";

Da wir über die IP-Adresse des Hosts verfügen, müssen die internen IP-Adressbereiche überprüft werden. Verwenden Sie nach Möglichkeit die shExpMatch -Funktion anstelle von isInNet. Die folgenden Codeausschnitte haben identische Ergebnisse, werden jedoch shExpMatch schneller ausgeführt:

if (isInNet(hostIP, "95.53.0.0", "255.255.0.0"))
    return "DIRECT";
if (shExpMatch(hostIP, "95.53.*"))
    return "DIRECT";

Bei JavaScript wird die Groß-/Kleinschreibung beachtet.

Das Proxyskript verwendet die Sprache JavaScript. Bei JavaScript wird die Groß-/Kleinschreibung beachtet. Daher wird eine if Großbuchstabenklausel nie wahr, während andere Parameter Kleinbuchstaben verwenden. Internet Explorer selbst konvertiert die Variablen host und url in Kleinbuchstaben, bevor die FindProxyForURL Funktion aufgerufen wird.

Diese Bedingung trifft für WinHTTPnicht zu. Dies liegt daran, dass WinHTTP und host direkt url an die Funktion übergeben werden.

Daher sollten die Parameter, die in der PAC-Datei überprüft werden, innerhalb des PAC konvertiert werden, bevor sie ausgewertet werden:

host = host.toLowerCase();

Verwenden von IPv6

Wenn Sie IPv6-Adressen verwenden und verarbeiten möchten, unterstützt Internet Explorer diese, da internet Explorer in jeder derzeit unterstützten Windows-Version (und in WinHTTP seit Windows Vista) enthalten ist. In diesem Fall müssen Sie jedoch "Ex"-Funktionen (z isInNetEx(). B. ) verwenden, wie im folgenden Artikel erwähnt:

IPv6-fähige Proxyhilfs-API-Definitionen

Ein Beispiel für die Implementierung finden Sie unter "myIpAddress"-Funktion gibt ein falsches Ergebnis in Internet Explorer 9 zurück.myIpAddressEx

Testen einer PAC-Datei

Wenn das Skript einen Syntaxfehler enthält (z. B. ein fehlendes ""-Zeichen in einer if Anweisung), wird das Skript nicht ausgeführt. Um Fehler zu minimieren, sollten Sie einen Skript-Editor verwenden, der die Syntaxüberprüfung ausführt. Mithilfe von Visual Studio können Sie die Erweiterung der PAC-Datei während der Bearbeitung in ".js" umbenennen, aber sie wieder in ".pac" umbenennen, bevor Sie sie auf den Webserver hochladen.

Hinweis

Ab Windows 10 können Sie keine dateibasierten PAC-Dateien mehr verwenden. Weitere Informationen finden Sie in den folgenden Artikeln:

Testen mit Autoprox.exe

Manchmal müssen Sie die PAC-Datei auch dann testen, wenn Sie keinen Zugriff auf die Website haben. Dazu können Sie das BefehlszeilentoolAutoprox.exe verwenden.

Wenn Sie das Tool in einem Befehl öffnen, ohne zusätzliche Parameter zu verwenden, wird die folgende Ausgabe mit der Hilfe zurückgegeben:

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

Dies ist die Ausgabe, wenn unser Beispiel verwendet wird:

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;

Fehlerbehandlung in Autoprox.exe

Wenn die PAC-Datei Syntaxfehler enthält, erhalten Sie die folgende Meldung:

FEHLER: InternetGetProxyInfo ist mit der Fehlernummer 0x3eb 1003 fehlgeschlagen.

Nachdem Sie den lokalen Test abgeschlossen haben, sollten Sie die PAC-Datei auf den Webserver kopieren, auf dem über das HTTP-Protokoll darauf zugegriffen wird.

Beispiel:

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

Haftungsausschluss für Kontaktinformationen von Drittanbietern

Die Kontaktinformationen zu den in diesem Artikel erwähnten Drittanbietern sollen Ihnen helfen, zusätzliche Informationen zu diesem Thema zu finden. Diese Kontaktinformationen können ohne vorherige Ankündigung geändert werden. Sie werden von Microsoft ohne jede Gewähr weitergegeben.