Nota
El acceso a esta página requiere autorización. Puede intentar iniciar sesión o cambiar directorios.
El acceso a esta página requiere autorización. Puede intentar cambiar los directorios.
Advertencia
La aplicación de escritorio de Internet Explorer 11, retirada y sin soporte, ha sido deshabilitada permanentemente a través de una actualización de Microsoft Edge en ciertas versiones de Windows 10. Para obtener más información, consulte Preguntas frecuentes sobre la retirada de la aplicación de escritorio de Internet Explorer 11.
En este tema se explica cómo optimizar el rendimiento de un script automático de configuración 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 sobre 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) se utilizan únicamente en la intranet y no se enrutan a través del proxy.
if (isPlainHostName(host))
return "DIRECT";
Consulta de sufijos DNS internos
Las zonas DNS usadas internamente normalmente se enrutan directamente. La manera más fácil de determinar estos hosts es mediante la dnsDomainis
función :
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 ShExMatch()
. Esta función realiza 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 escribe directamente en la barra de direcciones, no tiene que resolverla de nuevo. Puede usar el código siguiente para comprobar si el host ya está en 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 número. A continuación, el resultado se pasa a la variable return. El resultado es "true" para una dirección IP y "false" de lo contrario.
En el siguiente fragmento de código, la variable host IP contiene la dirección IP para utilizar 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 de la dirección IP del host podría 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, se deben comprobar los intervalos IP internos.
Siempre que sea posible, use la shExpMatch
función en lugar de isInNet
. Los fragmentos de código siguientes tienen resultados idénticos, aunque shExpMatch
se 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 cláusula if
que esté en mayúscula nunca será verdadera, mientras que otros parámetros usan minúsculas. Internet Explorer convierte las variables host
y url
en minúsculas antes de llamar a la FindProxyForURL
función.
Esta condición no es cierta para WinHTTP
. Esto se debe a que WinHTTP
pasa host
y 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 quieres usar y controlar direcciones IPv6, Internet Explorer las admite porque Internet Explorer se incluye en todas las versiones de Windows admitidas actualmente (y en WinHTTP desde Windows Vista). Sin embargo, en este caso, debe usar funciones "Ex" (como isInNetEx()
), como se mencionó en el siguiente artículo:
Definiciones de API auxiliares de proxy compatibles con IPv6
Para obtener un ejemplo de myIpAddressEx
implementación, vea la función "myIpAddress" devuelve un resultado incorrecto en Internet Explorer 9.
Prueba de un archivo PAC
Si el script contiene algún error de sintaxis (por ejemplo, un carácter ")" que falta en una if
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. Con Visual Studio, puede cambiar el nombre de la extensión del archivo PAC a ".js" durante la edición, pero cambiar su nombre a ".pac" antes de cargarlo en el servidor web.
Nota:
A partir de Windows 10, ya no puedes usar archivos PAC que se basan en ficheros. Para más información, consulte los siguientes artículos:
Pruebas con Autoprox.exe
A veces, tiene que probar el archivo PAC incluso si no tiene acceso al sitio web. Para ello, puede usar la herramienta de línea de comandos Autoprox.exe.
Si abre la herramienta dentro de un comando sin usar parámetros adicionales, se devuelve la siguiente salida con la ayuda incluida:
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
Esta es la salida si usa nuestro ejemplo:
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 accederá 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 otros proveedores para ayudarle a encontrar información adicional sobre este tema. Esta información de contacto puede cambiar sin previo aviso. Microsoft no garantiza la precisión de esta información de contacto de terceros.