Optimieren der Leistung mit skripts für die automatische Proxykonfiguration (PAC)

Wichtig

Die Internet Explorer 11-Desktopanwendung wird für bestimmte Versionen von Windows 10 eingestellt und ab dem 15. Juni 2022 nicht mehr unterstützt.

Sie können mit dem Internet Explorer-Modus in Microsoft Edge weiterhin auf ältere Websites zugreifen, für die Internet Explorer erforderlich ist. Anleitung.

Die Internet Explorer 11-Desktopanwendung wird schrittweise an den schnelleren, sichereren Microsoft Edge-Browser umgeleitet und letztendlich über Windows Update deaktiviert werden. Deaktivieren von IE heute.

In diesem Thema wird erläutert, wie Sie die Leistung eines Skripts für die automatische Proxykonfiguration (PAC-Datei, auch als Wpad.dat bezeichnet) optimieren. Dieses Dokument befasst sich mit der Behebung von Problemen mit den Intranetservern direkt und externem 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-Dateien) mit IEAK 11.

Hinweis

Die isInNet()Funktionen senden isResolvable()``dnsResolve() 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";

Abfrage 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 dasselbe Ergebnis zurück, fügt jedoch 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, unabhängig vom Webservernamen, sollte der Proxy umgangen werden, um direkt zu navigieren.

Wenn die IP-Adresse direkt in die Adressleiste eingegeben wird, müssen Sie sie nicht erneut auflösen. Mit dem folgenden Code können Sie ü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, denen ein Punkt und dann eine weitere Zahl folgt. Das Ergebnis wird dann an den Variablenrücklauf übergeben. Das Ergebnis ist "true" für eine IP und andernfalls "false".

Im folgenden Codeausschnitt enthält die Host-IP der Variablen die IP-Adresse für zukünftige Prü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. hat der Benutzer in der Adressleiste etwas falsches eingegeben), kann das Ergebnis in der Host-IP null sein. Alle zusätzlichen Fehlerbehandlungen werden vom Proxy ausgeführt:

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

Da wir über die IP-Adresse des Hosts verfügen, müssen die internen IP-Bereiche ü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 JavaScript-Sprache. Bei JavaScript wird die Groß-/Kleinschreibung beachtet. Daher wird eine if Klausel, die Großbuchstaben ist, nie wahr, während andere Parameter Kleinbuchstaben verwenden. Internet Explorer selbst konvertiert die Variablen host in url Kleinbuchstaben, bevor die FindProxyForURL Funktion aufgerufen wird.

Diese Bedingung gilt nicht für WinHTTP. Dies liegt daran, dass WinHTTP das host und das url direkt an die Funktion übergeben werden.

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

host = host.toLowerCase();

Verwenden von IPv6

Wenn Sie IPv6-Adressen verwenden und behandeln 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. B. ) verwenden, wie isInNetEx()im folgenden Artikel erwähnt:

IPv6-fähige Proxyhilfs-API-Definitionen

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

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, sie jedoch 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. Zu diesem Zweck 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

Hier sehen Sie die Ausgabe, wenn sie unser Beispiel verwendet:

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 mit 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

Microsoft stellt Kontaktinformationen von Drittanbietern bereit, damit Sie weitere Informationen zu diesem Thema finden können. Diese Kontaktinformationen können ohne vorherige Ankündigung geändert werden. Microsoft garantiert nicht die Genauigkeit von Kontaktinformationen von Drittanbietern.