Un pequeño equipo de seguimiento de precios configura un proxy residencial como proxy del sistema en Windows. Pocos días después, la página de consumo muestra muchos más gigabytes de los que debería necesitar el trabajo. Las actualizaciones del navegador, las videollamadas y el correo web también pasaron por el proxy, aunque solo había que ver dos tiendas de la competencia desde otra dirección IP. El equipo necesitaba una regla que dijera «estos sitios por el proxy, todo lo demás directo». Esa regla es un archivo PAC.
Esta guía explica qué es un archivo PAC (proxy auto-config, configuración automática de proxy), cómo lo ejecuta el navegador y qué puede devolver FindProxyForURL. Repasa las funciones auxiliares y sus trampas, un ejemplo probado que envía por el proxy solo los sitios de destino, WPAD y sus riesgos, por qué el archivo no puede guardar una contraseña y cómo la misma regla reduce el tráfico del proxy.
¿Qué es un archivo PAC?
Un archivo PAC es un archivo JavaScript de texto plano que define una sola función: FindProxyForURL(url, host). La función recibe la dirección que el navegador está a punto de abrir y devuelve una cadena que indica la ruta. Netscape añadió la configuración automática de proxy a Navigator 2.0, la misma versión que introdujo JavaScript.
PAC no tiene RFC ni especificación formal. Cada navegador trae su propia implementación, y los detalles varían. La referencia de MDN sobre archivos PAC (en inglés) describe la base común, incluido el tipo MIME, application/x-ns-proxy-autoconfig. El archivo suele terminar en .pac; cuando se encuentra mediante WPAD, se llama wpad.dat.
Un ajuste manual de proxy envía todo el tráfico a un solo proxy. Un archivo PAC vuelve a decidir en cada petición, así que un mismo navegador puede llegar a una tienda a través de un proxy y a la wiki de la oficina de forma directa.
¿Cómo usa un navegador un archivo PAC?
- Descarga el archivo. El navegador lo descarga de la dirección que introdujiste o de la que encontró WPAD. Chrome lo descarga directamente, nunca a través de un proxy, y necesita una respuesta HTTP
200en menos de 30 segundos con un cuerpo de menos de 1 MB. - Llama a la función antes de cada petición. En las direcciones
https://, Chrome quita antes la ruta y la consulta, de modo que la función vehttps://store.example/en lugar de la dirección completa. Chrome empezó a hacerlo en la versión 52, y desde la versión 75 no se puede desactivar. - Lee la respuesta de izquierda a derecha. La cadena se divide por los puntos y coma. El navegador prueba la primera entrada y solo pasa a la siguiente si no puede llegar a ese proxy.
- Aparta un proxy que ha fallado. Lo mueve al final de la lista durante un tiempo. Cuánto tiempo depende del navegador, así que no construyas reglas en torno a un plazo fijo.
- Recurre a otra opción si falta el archivo. Si Chrome no puede descargar el archivo, pasa a la siguiente opción, normalmente una conexión directa, sin ningún aviso. Solo un script PAC marcado como obligatorio hace que, en su lugar, las peticiones fallen. En nuestra prueba, un archivo con un error de sintaxis también llevó a Chrome a conectarse directamente.
Las reglas completas están en la documentación sobre proxies de Chromium (en inglés).
¿Qué puede devolver FindProxyForURL?
La función devuelve una cadena. Cada entrada es una palabra clave seguida, en el caso de los proxies, de host:port.
| Valor devuelto | Qué hace | Compatibilidad (fuente) | Atención |
|---|---|---|---|
DIRECT | Se conecta sin proxy | Palabra clave estándar (MDN) | Como respaldo en una regla de destino, envía la petición desde tu IP real |
PROXY pr.proxynet.io:8000 | Usa un proxy HTTP | Palabra clave estándar (MDN, Chromium) | Si el proxy pide contraseña, el navegador muestra un diálogo de inicio de sesión 407 |
SOCKS5 pr.proxynet.io:1080 | Usa un proxy SOCKS5 | Chrome y Firefox (Chromium, MDN) | Chrome no envía credenciales SOCKS5, así que el proxy debe permitir tu IP |
HTTPS proxy.example:443 | Usa un proxy al que llegas por TLS | Chrome y Firefox (Chromium, MDN) | El proxy debe hablar TLS en ese puerto |
SOCKS proxy.example:1080 | Usa un servidor SOCKS | Palabra clave estándar (MDN) | Chrome interpreta un SOCKS a secas como SOCKS4 |
Firefox también acepta HTTP host:port y SOCKS4 host:port, pero el analizador de Chrome no conoce HTTP, así que PROXY es la forma que funciona en todas partes. Chrome lee las palabras clave en mayúsculas o en minúsculas; MDN las escribe en mayúsculas, y nosotros también.
Una secuencia como "PROXY a.example:8000; PROXY b.example:8000; DIRECT" significa: prueba el primer proxy, después el segundo, y conéctate directamente solo si los dos están caídos. Ese último paso sirve para la navegación general y es un error en la recopilación de datos. La diferencia de protocolo entre los dos tipos de proxy está en Diferencia entre SOCKS y HTTP.
¿Qué funciones auxiliares puede usar un archivo PAC?
Las funciones integradas se dividen en dos grupos.
Comprobaciones de cadenas, rápidas y seguras: shExpMatch (patrones * y ? al estilo de la shell), dnsDomainIs, isPlainHostName (sin punto en el nombre), localHostOrDomainIs, dnsDomainLevels, y las funciones de tiempo weekdayRange, dateRange y timeRange.
Funciones que consultan el DNS: dnsResolve, isResolvable, e isInNet cuando recibe un nombre de host en lugar de una dirección IP. MDN advierte de que estas funciones tienen que consultar al servidor DNS y de que rara vez son necesarias.
Comprobamos tres trampas habituales con pacparser, que ejecuta archivos PAC en el motor QuickJS:
dnsDomainIs(host, "shop.example")solo compara el final de la cadena, así queevilshop.exampletambién coincide.dnsDomainIs(host, ".shop.example")lo corrige, pero entoncesshop.examplea secas deja de coincidir. Comprueba los dos:host === "shop.example" || dnsDomainIs(host, ".shop.example").shExpMatch(host, "*.panel.example")no coincide con el propiopanel.example.
myIpAddress() puede devolver una dirección equivocada en un equipo con varias interfaces de red, así que evita las reglas que dependan de la IP del propio equipo.
Cómo escribir un archivo PAC que solo envíe por el proxy los sitios de destino
Este es el escenario de la introducción en un solo archivo. Los sitios de destino del seguimiento de precios y sus subdominios pasan por un Proxies residenciales. Un panel de control que debe mantener una misma dirección pasa por un proxy SOCKS5, con un proxy HTTP como respaldo. Todo lo demás va directo. Sustituye los dominios .example por los tuyos.
// proxy.pac: solo los sitios de la lista usan un proxy, todo lo demás va directo.
function FindProxyForURL(url, host) {
host = host.toLowerCase();
// 1. Nombres simples (intranet, impresora) y localhost: siempre directo.
if (isPlainHostName(host) || host === "localhost") {
return "DIRECT";
}
// 2. Direcciones IP privadas y de loopback: directo. La comprobación con la regex
// hace que isInNet solo reciba direcciones IP, así que nunca consulta el DNS.
if (/^\d{1,3}(\.\d{1,3}){3}$/.test(host) &&
(isInNet(host, "10.0.0.0", "255.0.0.0") ||
isInNet(host, "172.16.0.0", "255.240.0.0") ||
isInNet(host, "192.168.0.0", "255.255.0.0") ||
isInNet(host, "127.0.0.0", "255.0.0.0"))) {
return "DIRECT";
}
// 3. Sitios de destino del seguimiento de precios y sus subdominios: proxy residencial.
// Sin "; DIRECT" al final: si el proxy está caído, la petición falla
// en lugar de salir desde tu propia dirección IP.
var targets = ["shop.example", "store.example"];
for (var i = 0; i < targets.length; i++) {
if (host === targets[i] || dnsDomainIs(host, "." + targets[i])) {
return "PROXY pr.proxynet.io:8000";
}
}
// 4. Un panel que debe mantener una IP: primero SOCKS5, HTTP como respaldo.
// Pon aquí el host y los puertos de tu proxy ISP estático.
if (host === "panel.example" || shExpMatch(host, "*.panel.example")) {
return "SOCKS5 pr.proxynet.io:1080; PROXY pr.proxynet.io:8000";
}
// 5. Todo lo demás: directo.
return "DIRECT";
}Primero se pasa el host a minúsculas, porque las funciones auxiliares comparan cadenas de forma exacta. isInNet solo se ejecuta después de que la regex haya confirmado una dirección IP, así que el script nunca espera al DNS. El código se limita a var y a bucles simples, porque no todos los motores PAC ejecutan JavaScript moderno. En un archivo PAC, la secuencia separada por punto y coma es el mecanismo de reintento; la lógica de reintentos en código le corresponde al scraper (Códigos de estado HTTP en web scraping).
Cómo lo probamos
Pasamos el archivo por pacparser 1.5.2 en Python 3.13 con diez hosts, y cada uno devolvió la ruta esperada, incluidos WWW.Shop.Example (proxy) y notshop.example (directo). Después lo servimos en local con el tipo application/x-ns-proxy-autoconfig, apuntamos los endpoints a dos proxies de prueba locales y abrimos Chrome 154 con --proxy-pac-url. Los hosts de destino llegaron al proxy HTTP y los demás hosts fueron directos. Para el panel, Chrome probó primero SOCKS5, ofreciendo solo el método «sin autenticación», y después pasó al respaldo HTTP. Una copia a la que le faltaba una llave envió todas las peticiones directamente, sin ningún aviso.
¿Cómo se configura un dispositivo o un navegador para usar un archivo PAC?
Sirve el archivo desde un servidor web, por HTTPS siempre que puedas, con el Content-Type que pide MDN. Después introduce su dirección:
- Windows: el interruptor Usar script de configuración; los pasos están en configuración de proxy en Windows y Chrome.
- Mac: la fila Configuración de proxy automática; consulta cuándo usarla en un Mac.
- Android: la opción Proxy configurado automáticamente (Proxy Auto-Config) de la red Wi-Fi (configuración de proxy en Android).
- Firefox: URL de configuración automática del proxy en la configuración de conexión (configuración de proxy en Firefox).
Para cambiar entre unos pocos perfiles dentro de un mismo navegador, una extensión suele ser más sencilla (SwitchyOmega). Si encontraste una dirección PAC en un equipo del trabajo, consulta cómo encontrar la dirección del servidor proxy.
¿Qué es WPAD y por qué es un riesgo?
WPAD (Web Proxy Auto-Discovery, detección automática de proxy web) está detrás del interruptor «Detectar la configuración automáticamente»: el cliente busca un archivo PAC en la red. El borrador de WPAD de 1999 enumera varios métodos de detección, y los clientes usan sobre todo dos: la opción 252 de DHCP, que entrega la URL, y las consultas DNS de un host llamado wpad. Un equipo llamado pc1.sales.corp.example pregunta por wpad.sales.corp.example, después por wpad.corp.example, y pide /wpad.dat al primer nombre que responde. Chrome prueba DHCP antes que DNS, pero solo admite el método DHCP en Windows y ChromeOS. El borrador caducó sin llegar a ser un RFC.
El cliente confía en quien responda. Si un portátil configurado para la detección automática se une a la red de una cafetería, o su consulta WPAD se filtra al DNS público, el servidor de un desconocido puede entregarle un archivo PAC y desviar su tráfico. La alerta TA16-144A de CISA explica cómo los nuevos dominios de nivel superior facilitaron estas colisiones de nombres.
Para proteger tus equipos:
- Desactiva la detección automática donde no haga falta, sobre todo en los portátiles que salen de la oficina.
- Introduce la dirección PAC de forma explícita, por HTTPS.
- En Windows 10 versión 1809, Windows Server 2019 y posteriores, pon el valor de registro
DisableWpaden1, como documenta Microsoft, y desactiva también la detección en Configuración, porque los navegadores leen ese interruptor. - Registra y bloquea en el firewall las peticiones salientes de
wpad.dat, como sugiere CISA (Proxy o firewall).
¿Por qué un archivo PAC no puede guardar un usuario y una contraseña?
Un archivo PAC responde a una sola pregunta: ¿adónde debe ir esta petición? Devuelve una palabra clave, un host y un puerto, sin ningún campo para credenciales.
Si un proxy HTTP pide contraseña, responde con 407 y el navegador muestra un diálogo de inicio de sesión. Chrome no admite ningún método de autenticación para SOCKS5, así que una entrada SOCKS5 solo funciona cuando el proxy deja pasar tu IP. Para trabajos automatizados y para SOCKS5, la autenticación por lista blanca de IP es la vía práctica: añades tu IP de salida a la lista de IP autorizadas de tu cuenta de proxy. No pongas las credenciales en las URL para salir del paso. Los dos métodos, incluido lo que pasa cuando cambia tu IP, se comparan en Autenticación de proxy: user:pass o lista blanca de IP.
¿Cómo reduce un archivo PAC el tráfico y el costo del proxy?
Los proxies residenciales y móviles se facturan por gigabyte; los proxies ISP y de centro de datos, por dirección IP. Con un proxy para todo el sistema, también se facturan las actualizaciones, las videollamadas y las descargas. Un archivo PAC envía por el proxy residencial solo los dominios de destino, de modo que los gigabytes facturados corresponden al trabajo.
Para un panel que debe mantener una misma dirección entre sesiones, encaja mejor un producto por IP: un Proxies ISP, o un Proxies SOCKS5 con tu IP en la lista blanca.
Casos de uso
- Seguimiento de precios: solo las tiendas que vigilas usan el proxy, dentro de las reglas de su
robots.txty a un ritmo de peticiones moderado (seguimiento de precios de la competencia). - Redes de oficina: las direcciones internas van directas y el tráfico externo pasa por un proxy de empresa como Squid (configuración de un proxy Squid).
- Comprobaciones por país: cada dominio de destino recibe el tipo de salida que necesita (proxy residencial o de centro de datos).
- Probar un proxy nuevo: un dominio de prueba pasa por él mientras la navegación normal sigue siendo directa (cómo probar un proxy).
- Comprobar fugas: una regla PAC cubre las peticiones del navegador, pero WebRTC y el DNS todavía pueden revelar tu dirección (fugas de WebRTC y DNS).
- Proxies locales: un proxy de depuración en
127.0.0.1:8080recibe solo los dominios que inspeccionas (puerto 8080).
Errores comunes
Estos errores son propios de los archivos PAC; para los errores de conexión en general, consulta El servidor proxy no responde.
- Un tipo MIME incorrecto o un archivo que falta. MDN pide a los servidores que envíen
application/x-ns-proxy-autoconfig. Chrome además necesita exactamente200; un404es una descarga fallida y termina en una conexión directa. - No ver ningún cambio tras editar. Los navegadores guardan en memoria el script cargado. Usa Recargar en la configuración de conexión de Firefox, Re-apply settings en
chrome://net-internals/#proxy, o reinicia el navegador. - Consultar el DNS en el script.
isInNetcon un nombre de host,dnsResolveeisResolvablehacen una consulta por petición, y un servidor DNS lento hace esperar a cada página. - Un error de sintaxis. Chrome va directo sin ningún mensaje. Prueba el archivo con pacparser antes de desplegarlo.
- Reglas de ruta en HTTPS.
shExpMatch(url, "*/products/*")nunca coincide con una direcciónhttps://en Chrome, porque la ruta se elimina. En nuestra prueba, el mismo tipo de regla sí coincidió conhttp://. Compara conhost. - El punto en dnsDomainIs. Sin él, coinciden los dominios parecidos; con él, el dominio a secas deja de coincidir.
- Escribir
HTTP host:porto unSOCKSa secas. Chrome rechaza lo primero e interpreta lo segundo como SOCKS4. - Un respaldo
DIRECTen destinos de recopilación de datos. Cuando el proxy está caído, el sitio ve tu propia IP.
Guía de decisión
| Necesidad | Recomendación |
|---|---|
| Enviar solo unos pocos dominios por un proxy | Un archivo PAC: PROXY para los destinos, DIRECT para el resto |
| Todo el tráfico del navegador por un solo proxy | No hace falta PAC; basta con un proxy manual del sistema (Windows y Chrome) |
| Tu IP real nunca debe llegar a un sitio de destino | Devuelve solo PROXY para ese sitio, sin respaldo ; DIRECT |
| Usar SOCKS5 en Chrome | Devuelve SOCKS5 host:port y añade tu IP a la lista blanca |
| La misma dirección PAC en todos los equipos de la oficina | Distribúyela por directiva o con gestión de dispositivos; si usas WPAD, protege DHCP y DNS |
| Un portátil que también se usa en redes de cafeterías y de casa | Desactiva la detección automática; configura DisableWpad en Windows |
| Un panel que necesita la misma IP en cada sesión | Apunta ese dominio a un proxy ISP estático |
Preguntas frecuentes
¿Cómo abro o edito un archivo PAC?
Un archivo PAC es texto plano, así que lo abre el Bloc de notas o cualquier editor de código. Un navegador que abre la URL muestra el texto o descarga el archivo, según el tipo MIME. Otros formatos comparten la extensión .pac; si el archivo parece contener datos binarios, no es una configuración de proxy.
¿Dónde está el archivo PAC en Windows?
Normalmente no es un archivo local. Windows guarda la dirección introducida en Usar script de configuración y descarga el archivo desde allí. Los pasos para verla o cambiarla están en configuración de proxy en Windows y Chrome.
¿Puede un archivo PAC incluir usuario y contraseña?
No. La función solo devuelve una palabra clave, un host y un puerto. En un proxy HTTP, el navegador pide las credenciales en un diálogo 407; para trabajos automatizados y SOCKS5, usa la autenticación por lista blanca de IP.
¿Qué diferencia hay entre PAC y WPAD?
El archivo PAC contiene las reglas. WPAD encuentra la dirección de un archivo PAC en la red local mediante DHCP o DNS. Puedes usar un archivo PAC sin WPAD introduciendo tú mismo su dirección, que además es la opción más segura.
¿Puede un archivo PAC devolver un proxy SOCKS5?
Sí, como SOCKS5 host:port; Chrome y Firefox lo siguen. Chrome no envía credenciales SOCKS5, así que añade tu IP a la lista blanca del proxy.
Cambié mi archivo PAC, ¿por qué el navegador sigue usando las reglas antiguas?
El navegador conserva la versión que cargó hasta que vuelve a cargar la configuración. Pulsa Recargar en Firefox, usa Re-apply settings en chrome://net-internals/#proxy o reinicia el navegador. Un nombre de archivo nuevo para cada versión (proxy-v2.pac) elimina la duda.
En resumen
Un archivo PAC convierte el proxy de un interruptor de encendido y apagado en una decisión para cada petición: FindProxyForURL mira el host y devuelve DIRECT, PROXY o SOCKS5, y el navegador prueba las entradas de izquierda a derecha. Compara con host, evita las funciones que consultan el DNS y deja sin respaldo DIRECT las reglas de los destinos de recopilación de datos. Introduce tú mismo la dirección PAC por HTTPS y desactiva WPAD donde no haga falta. Como el archivo no puede guardar una contraseña, combínalo con la autenticación por lista blanca de IP y elige el tipo de proxy de cada regla entre nuestros servicios de proxy.




