Optimización del rendimiento con scripts automáticos de configuración de proxy (PAC)
Importante
La aplicación de escritorio Internet Explorer 11 está retirada y sin soporte a partir del 15 de junio de 2022 para determinadas versiones de Windows 10.
Todavía puede acceder a sitios antiguos heredados que requieren Internet Explorer con el modo Internet Explorer en Microsoft Edge. Obtenga más información.
La aplicación de escritorio Internet Explorer 11 se redirigirá progresivamente al explorador Microsoft Edge, más rápido y seguro. En última instancia, se deshabilitará a través de Windows Update. Deshabilite IE hoy.
En este tema se explica cómo optimizar el rendimiento de un script de configuración automática de proxy (archivo PAC, también conocido como Wpad.dat). Este documento se centra en cómo resolver problemas con los servidores de intranet directamente y el tráfico interno externo a través de un servidor proxy.
Para obtener más información acerca de las funciones que se usan para evaluar una dirección (DIRECCIÓN URL o nombre de host), vea: Usar archivos de autoconfiguración de proxy (.pac) con IEAK 11.
Nota
Las isInNet()funciones , isResolvable()y dnsResolve() envían consultas al subsistema DNS. Por lo tanto, debe evitar o, al menos, minimizar el uso de estas funciones.
Consulta de nombres NetBIOS
Los nombres NetBIOS (nombres de servidor que no contienen ningún punto) solo se usan en la intranet y no se enruta a través del proxy:
if (isPlainHostName(host))
return "DIRECT";
Consulta de sufijos DNS internos
Las zonas DNS usadas internamente suelen enrutar directamente. La forma más sencilla de determinar dichos hosts es mediante la función dnsDomainis :
if (dnsDomainIs(host, ".dns.company.com"))
return "DIRECT";
Se puede obtener un método alternativo y más rápido para el mismo resultado mediante el uso de ShExMatch(). Esta función hace una comparación de cadenas. Devuelve el mismo resultado, pero agrega un asterisco (*) como carácter comodín:
if (shExpMatch(host, "*.dns.company.com"))
return "DIRECT";
Consulta de intervalos IP
Si la dirección IP del host pertenece a la intranet local, independientemente del nombre del servidor web, debe omitir el proxy para navegar directamente.
Si la dirección IP se introduce directamente en la barra de direcciones, no es necesario volver a resolverla. Puede usar el siguiente código para comprobar si el host ya tiene el formato de dirección IP:
var isIpV4Addr = /^(\d+.){3}\d+$/;
ret = isIpV4Addr.test(host);
Este código comprueba si el host de variable contiene tres números seguidos de un punto y, a continuación, seguidos de otro numeral. A continuación, el resultado se pasa a la variable return. El resultado es "true" para una IP y "false" en caso contrario.
En el siguiente fragmento de código, la dirección IP del host variable contiene la dirección IP para su uso en futuras comprobaciones:
var hostIP;
var isIpV4Addr = /^(\d+.){3}\d+$/;
if (isIpV4Addr.test(host))
hostIP = host;
else
hostIP = dnsResolve(host);
Cuando se pasa un host no existente a la función (por ejemplo, el usuario escribió algo incorrecto en la barra de direcciones), el resultado en la IP de host puede ser cero. El proxy realizará cualquier control de errores adicional:
if (hostIP==0)
return "PROXY myproxy:80";
Dado que tenemos la dirección IP del host, los intervalos IP internos deben comprobarse.
Siempre que sea posible, use la shExpMatch función en lugar de isInNet. Los fragmentos de código siguientes tienen resultados idénticos, aunque se shExpMatch ejecuta más rápido:
if (isInNet(hostIP, "95.53.0.0", "255.255.0.0"))
return "DIRECT";
if (shExpMatch(hostIP, "95.53.*"))
return "DIRECT";
JavaScript distingue mayúsculas de minúsculas
El script de proxy usa el lenguaje JavaScript. JavaScript distingue mayúsculas de minúsculas. Por lo tanto, una if cláusula que está en mayúsculas nunca se convertirá en true, mientras que otros parámetros usan minúsculas. Internet Explorer convierte las variables host url en minúsculas antes de llamar a FindProxyForURL la función.
Esta condición no es true para WinHTTP. Esto se debe a WinHTTP que pasa el host y el url directamente a la función.
Por lo tanto, los parámetros que se comprueban dentro del archivo PAC deben convertirse dentro del PAC antes de evaluarse:
host = host.toLowerCase();
Uso de IPv6
Si desea usar y controlar direcciones IPv6, Internet Explorer las admite porque Internet Explorer se incluye en todas las versiones Windows compatibles actualmente (y en WinHTTP desde Windows Vista). Sin embargo, en este caso, debe usar funciones "Ex" ( isInNetEx()como ), como se menciona en el siguiente artículo:
Definiciones de API auxiliar de proxy compatibles con IPv6
Para obtener un ejemplo de myIpAddressEx implementación, vea la función "myIpAddress" que devuelve un resultado incorrecto en Internet Explorer 9.
Probar un archivo PAC
Si el script contiene algún error de sintaxis (por ejemplo, un carácter ")" if que falta en una instrucción), el script no se ejecuta. Para minimizar los errores, considere la posibilidad de usar un editor de scripts que ejecute la comprobación de sintaxis. Al usar Visual Studio, puede cambiar el nombre de la extensión del archivo PAC a ".js" durante la edición, pero cambiar el nombre a ".pac" antes de cargarlo en el servidor web.
Nota
A partir Windows 10, ya no puede usar archivos PAC basados en archivos. Para más información, consulte los siguientes artículos:
Pruebas con Autoprox.exe
A veces, tienes que probar el archivo PAC incluso si no tienes acceso al sitio web. Para ello, puede usar la herramientaAutoprox.exe línea de comandos.
Si abre la herramienta dentro de un comando sin usar parámetros adicionales, se devuelve el siguiente resultado con la ayuda:
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
Este es el resultado si usa nuestra muestra:
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;
Control de errores en Autoprox.exe
Si el archivo PAC contiene errores de sintaxis, recibirá el siguiente mensaje:
ERROR: Error de InternetGetProxyInfo con el número de error 0x3eb 1003.
Después de finalizar la prueba local, debe copiar el archivo PAC en el servidor web en el que se tendrá acceso a él a través del protocolo HTTP.
Ejemplo:
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;";
}
Aviso de declinación de responsabilidades sobre la información de contacto de terceros
Microsoft proporciona información de contacto de terceros para ayudarle a encontrar información adicional sobre este tema. Dicha información de contacto puede cambiar sin notificación previa. Microsoft no garantiza la precisión de la información de contacto de terceros.