Condividi tramite


Ottimizzazione delle prestazioni con script di configurazione proxy automatici (PAC)

Avviso

L'applicazione desktop Internet Explorer 11, ritirata e fuori supporto, è stata disabilitata in modo permanente tramite un aggiornamento di Microsoft Edge su alcune versioni di Windows 10. Per altre informazioni, vedere Domande frequenti sul ritiro delle app desktop di Internet Explorer 11.

Questo argomento illustra come ottimizzare le prestazioni di uno script di configurazione proxy automatico (file PAC, noto anche come Wpad.dat). Questo documento è incentrato su come risolvere i problemi relativi ai server Intranet direttamente e al traffico interno esterno attraverso un server proxy.

Per altre informazioni sulle funzioni usate per valutare un indirizzo (URL o nome host), vedere: Usare i file di configurazione automatica del proxy (pac) con IEAK 11.

Annotazioni

Le isInNet() funzioni, isResolvable() e dnsResolve() inviano query al sottosistema DNS. Pertanto, è consigliabile evitare o, almeno, ridurre al minimo l'uso di queste funzioni.

Effettuare una ricerca dei nomi NetBIOS

I nomi NetBIOS (nomi di server che non contengono punti) vengono usati solo nella Intranet e non vengono instradati tramite il proxy:

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

Richiesta per suffissi DNS interni

Le zone DNS usate internamente vengono in genere instradate direttamente. Il modo più semplice per determinare tali host consiste nell'usare la dnsDomainis funzione :

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

È possibile ottenere un metodo alternativo e più veloce per lo stesso risultato usando ShExMatch(). Questa funzione esegue un confronto di stringhe. Restituisce lo stesso risultato ma aggiunge un asterisco (*) come carattere jolly:

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

Richiesta per intervalli IP

Se l'indirizzo IP dell'host appartiene alla intranet locale, indipendentemente dal nome del server Web, deve ignorare il proxy per spostarsi direttamente.

Se l'indirizzo IP viene immesso direttamente nella barra degli indirizzi, non è necessario risolverlo di nuovo. È possibile usare il codice seguente per verificare se l'host è già nel formato di indirizzo IP:

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

Questo codice controlla se l'host variabile contiene tre numeri seguiti da un punto e quindi seguiti da un altro numero. Il risultato viene quindi passato alla variabile return. Il risultato è "true" per un indirizzo IP e "false" in caso contrario.

Nel frammento di codice seguente l'INDIRIZZO IP dell'host variabile contiene l'indirizzo IP da usare nei controlli futuri:

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

Quando un host non esistente viene passato alla funzione (ad esempio, l'utente ha immesso qualcosa di errato nella barra degli indirizzi), il risultato in ip host potrebbe essere zero. Qualsiasi ulteriore gestione degli errori verrà eseguita dal proxy:

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

Poiché è presente l'indirizzo IP dell'host, è necessario controllare gli intervalli IP interni. Quando possibile, usare la shExpMatch funzione anziché isInNet. I frammenti di codice seguenti hanno risultati identici, anche se shExpMatch vengono eseguiti più velocemente:

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

JavaScript fa distinzione tra maiuscole e minuscole

Lo script proxy usa il linguaggio JavaScript. JavaScript fa distinzione tra maiuscole e minuscole. Pertanto, una if clausola che è maiuscola non diventerà mai true, mentre altri parametri usano lettere minuscole. Internet Explorer converte le variabili host e url in lettere minuscole prima che venga chiamata la FindProxyForURL funzione.

Questa condizione non è vera per WinHTTP. Ciò è dovuto al fatto che WinHTTP passa host e url direttamente alla funzione.

Pertanto, i parametri controllati all'interno del file PAC devono essere convertiti all'interno del PAC prima di essere valutati:

host = host.toLowerCase();

Utilizzare IPv6

Se vuoi usare e gestire gli indirizzi IPv6, Internet Explorer li supporta perché Internet Explorer è incluso in ogni versione di Windows attualmente supportata (e in WinHTTP da Windows Vista). Tuttavia, in questo caso, è necessario usare le funzioni "Ex" (ad esempio isInNetEx()), come indicato nell'articolo seguente:

Definizioni dell'API helper proxy compatibile con IPv6

Per un esempio di myIpAddressEx implementazione, vedere la funzione "myIpAddress" restituisce un risultato errato in Internet Explorer 9.

Test di un file PAC

Se lo script contiene un errore di sintassi (ad esempio, un carattere ")" mancante in un'istruzione if ), lo script non viene eseguito. Per ridurre al minimo gli errori, è consigliabile usare un editor di script che esegue il controllo della sintassi. Usando Visual Studio, è possibile rinominare l'estensione del file PAC in ".js" durante la modifica, ma rinominarla nuovamente in ".pac" prima di caricarla nel server Web.

Annotazioni

A partire da Windows 10, non puoi più usare file PAC basati su file. Per altre informazioni, vedere gli articoli seguenti:

Test con Autoprox.exe

A volte, è necessario testare il file PAC anche se non si ha accesso al sito Web. A tale scopo, è possibile usare lo strumento da riga di comando Autoprox.exe.

Se si apre lo strumento all'interno di un comando senza utilizzare parametri aggiuntivi, viene restituito l'output seguente con l'aiuto:

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

Di seguito è riportato l'output se utilizza il nostro esempio.

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;

Gestione degli errori in Autoprox.exe

Se il file PAC contiene errori di sintassi, viene visualizzato il messaggio seguente:

ERRORE: InternetGetProxyInfo non riuscito con numero di errore 0x3eb 1003.

Dopo aver completato il test locale, è necessario copiare il file PAC nel server Web in cui verrà eseguito l'accesso tramite il protocollo HTTP.

Esempio:

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

Dichiarazione di non responsabilità di contatti di terze parti

Microsoft fornisce informazioni di contatto di terze parti per aiutarti a trovare ulteriori informazioni su questo argomento. Queste informazioni di contatto sono soggette a modifica senza preavviso. Microsoft non garantisce l'accuratezza delle informazioni di contatto di terze parti.