Delen via


Prestaties optimaliseren met automatische proxyconfiguratiescripts (PAC)

Waarschuwing

De buiten gebruik gestelde, niet meer ondersteunde Internet Explorer 11-desktoptoepassing is permanent uitgeschakeld via een Microsoft Edge-update op bepaalde versies van Windows 10. Zie Veelgestelde vragen over buitengebruikstelling van bureaublad-apps in Internet Explorer 11 voor meer informatie.

In dit onderwerp wordt uitgelegd hoe u de prestaties van een automatisch proxyconfiguratiescript (PAC-bestand, ook wel bekend als Wpad.dat) optimaliseert. Dit document richt zich op het direct oplossen van problemen met de intranetservers en het afhandelen van extern intern verkeer via een proxyserver.

Zie voor meer informatie over de functies die worden gebruikt om een adres (URL of hostnaam) te evalueren: Proxy autoconfiguration -bestanden (.pac) gebruiken met IEAK 11.

Notitie

De functies isInNet(), isResolvable() en dnsResolve() verzenden queries naar het DNS-subsysteem. Daarom moet u het gebruik van deze functies vermijden of ten minste minimaliseren.

Query uitvoeren op NetBIOS-namen

NetBIOS-namen (servernamen die geen punt bevatten) worden alleen in het intranet gebruikt en worden niet via de proxy gerouteerd.

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

Query uitvoeren op interne DNS-achtervoegsels

Intern gebruikte DNS-zones worden doorgaans rechtstreeks gerouteerd. De eenvoudigste manier om dergelijke hosts te bepalen, is door de dnsDomainis functie te gebruiken:

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

Een alternatieve en snellere methode voor hetzelfde resultaat kan worden verkregen met behulp van ShExMatch(). Deze functie vergelijkt tekenreeksen. Het retourneert hetzelfde resultaat, maar voegt een sterretje (*) toe als jokerteken:

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

Query uitvoeren op IP-bereiken

Als het IP-adres van de host deel uitmaakt van het lokale intranet, ongeacht de naam van de webserver, moet de proxy worden omzeild om rechtstreeks te navigeren.

Als het IP-adres rechtstreeks in de adresbalk wordt ingevoerd, hoeft u het niet opnieuw op te lossen. U kunt de volgende code gebruiken om te controleren of de host al de IP-adresindeling heeft:

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

Met deze code wordt gecontroleerd of de variabelehost drie cijfers bevat die worden gevolgd door een punt en vervolgens door een andere numerieke waarde. Het resultaat wordt vervolgens doorgegeven aan de variabele return. Het resultaat is 'true' voor een IP-adres en 'false' anders.

In het volgende codefragment bevat het host-IP-adres van de variabele het IP-adres voor gebruik in toekomstige controles:

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

Wanneer een niet-bestaande host wordt doorgegeven aan de functie (de gebruiker heeft bijvoorbeeld iets verkeerds ingevoerd in de adresbalk), kan het resultaat in host-IP nul zijn. Eventuele aanvullende foutafhandeling wordt uitgevoerd door de proxy:

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

Omdat we het IP-adres van de host hebben, moeten de interne IP-bereiken worden gecontroleerd. Gebruik waar mogelijk de shExpMatch functie in plaats van isInNet. De volgende codefragmenten hebben identieke resultaten, hoewel shExpMatch deze sneller worden uitgevoerd:

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

JavaScript is hoofdlettergevoelig

Het proxyscript maakt gebruik van de JavaScript-taal. JavaScript is hoofdlettergevoelig. Daarom zal een if clausule in hoofdletters nooit waar worden, terwijl andere parameters kleine letters gebruiken. Internet Explorer zet de variabelen host zelf om in url kleine letters voordat de FindProxyForURL functie wordt aangeroepen.

Deze voorwaarde geldt niet voor WinHTTP. Dit komt doordat WinHTTP de host en de url rechtstreeks aan de functie worden doorgegeven.

Daarom moeten de parameters die in het PAC-bestand worden gecontroleerd, worden geconverteerd binnen het PAC voordat ze worden geƫvalueerd:

host = host.toLowerCase();

IPv6 gebruiken

Als u IPv6-adressen wilt gebruiken en verwerken, ondersteunt Internet Explorer deze omdat Internet Explorer is opgenomen in elke momenteel ondersteunde Windows-versie (en in WinHTTP sinds Windows Vista). In dit geval moet u echter 'Ex'-functies (zoals isInNetEx()), zoals vermeld in het volgende artikel gebruiken:

Api-definities voor IPv6-compatibele proxy's

Zie 'myIpAddress'-myIpAddressEx voor een voorbeeld van de implementatie.

Een PAC-bestand testen

Als het script een syntaxisfout bevat (bijvoorbeeld een ontbrekend ")" teken in een if instructie), wordt het script niet uitgevoerd. Als u fouten wilt minimaliseren, kunt u overwegen een scripteditor te gebruiken waarmee syntaxiscontrole wordt uitgevoerd. Met Behulp van Visual Studio kunt u de extensie van het PAC-bestand wijzigen in '.js' tijdens het bewerken, maar de naam ervan weer wijzigen in .pac voordat u het uploadt naar de webserver.

Notitie

Vanaf Windows 10 kunt u bestandgebaseerde PAC-bestanden niet meer gebruiken. Raadpleeg voor meer informatie de volgende artikelen:

Testen met Autoprox.exe

Soms moet u het PAC-bestand testen, zelfs als u geen toegang tot de website hebt. Hiervoor kunt u het opdrachtregelprogramma Autoprox.exe gebruiken.

Als u het hulpprogramma opent binnen een opdracht zonder extra parameters te gebruiken, wordt de volgende uitvoer met de helpinformatie weergegeven.

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

Dit is de uitvoer als deze gebruikmaakt van ons voorbeeld:

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;

Foutafhandeling in Autoprox.exe

Als het PAC-bestand syntaxisfouten bevat, ontvangt u het volgende bericht:

FOUT: InternetGetProxyInfo is mislukt met foutnummer 0x3eb 1003.

Nadat u de lokale test hebt voltooid, moet u het PAC-bestand kopiƫren naar de webserver waarop het wordt geopend via het HTTP-protocol.

Voorbeeld:

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

Contactverantwoordelijkheid van derden

Microsoft biedt contactgegevens van derden om u te helpen aanvullende informatie over dit onderwerp te vinden. Deze contactinformatie kan zonder voorafgaande kennisgeving worden gewijzigd. Microsoft garandeert niet de nauwkeurigheid van contactgegevens van derden.