Nota
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare ad accedere o modificare le directory.
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare a modificare le directory.
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.