---
title: "¿Qué es un archivo PAC? FindProxyForURL, sintaxis y ejemplos"
description: "Un archivo PAC es un pequeño archivo JavaScript que indica al navegador si cada URL va directa o por un proxy. Aprende FindProxyForURL, WPAD y errores comunes."
url: https://proxynet.io/es/blog/pac-file
date: 2026-09-24
author: "Acar Diveroli"
category: "Tutoriales, Proxy 101"
lang: es
---

# ¿Qué es un archivo PAC? FindProxyForURL, sintaxis y ejemplos

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.

> **Nota: Respuesta breve**
>
> Un archivo PAC es un pequeño archivo JavaScript con una sola función, `FindProxyForURL(url, host)`, a la que el navegador llama antes de cada petición. Si devuelve `"DIRECT"`, el navegador se conecta por su cuenta; si devuelve `"PROXY host:port"` o `"SOCKS5 host:port"`, la petición pasa por ese proxy. Puedes indicar varias opciones separadas por punto y coma, y el navegador las prueba de izquierda a derecha. Sirves el archivo desde una dirección web e introduces esa dirección en la configuración del sistema o del navegador; WPAD busca la dirección en la red de forma automática. El archivo no puede llevar usuario ni contraseña, así que encaja bien con la autenticación por lista blanca de IP.

## ¿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](https://developer.mozilla.org/en-US/docs/Web/HTTP/Guides/Proxy_servers_and_tunneling/Proxy_Auto-Configuration_PAC_file) (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?

1. **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 `200` en menos de 30 segundos con un cuerpo de menos de 1 MB.
2. **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 ve `https://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.
3. **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.
4. **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.
5. **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](https://chromium.googlesource.com/chromium/src/+/HEAD/net/docs/proxy.md) (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](/es/blog/socks-vs-http-proxy).

## ¿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í que `evilshop.example` también coincide.
- `dnsDomainIs(host, ".shop.example")` lo corrige, pero entonces `shop.example` a secas deja de coincidir. Comprueba los dos: `host === "shop.example" || dnsDomainIs(host, ".shop.example")`.
- `shExpMatch(host, "*.panel.example")` no coincide con el propio `panel.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](https://proxynet.io/es/residential-proxy). 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.

```js
// 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](/es/blog/http-status-codes-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](/es/blog/windows-chrome-proxy-settings).
- **Mac:** la fila **Configuración de proxy automática**; consulta [cuándo usarla en un Mac](/es/blog/mac-safari-proxy-settings).
- **Android:** la opción **Proxy configurado automáticamente** (Proxy Auto-Config) de la red Wi-Fi ([configuración de proxy en Android](/es/blog/android-proxy-settings)).
- **Firefox:** **URL de configuración automática del proxy** en la configuración de conexión ([configuración de proxy en Firefox](/es/blog/firefox)).

Para cambiar entre unos pocos perfiles dentro de un mismo navegador, una extensión suele ser más sencilla ([SwitchyOmega](/es/blog/switchy-omega)). Si encontraste una dirección PAC en un equipo del trabajo, consulta [cómo encontrar la dirección del servidor proxy](/es/blog/find-proxy-server-address).

## ¿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](https://datatracker.ietf.org/doc/html/draft-ietf-wrec-wpad-01) 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](https://www.cisa.gov/news-events/alerts/2016/05/23/wpad-name-collision-vulnerability) 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 `DisableWpad` en `1`, como [documenta Microsoft](https://learn.microsoft.com/en-us/troubleshoot/windows-server/networking/disable-http-proxy-auth-features), 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](/es/blog/proxy-vs-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](/es/blog/proxy-authentication-methods).

## ¿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](https://proxynet.io/es/static-isp-residential-proxy), o un [Proxies SOCKS5](https://proxynet.io/es/socks5-proxy) 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.txt` y a un ritmo de peticiones moderado ([seguimiento de precios de la competencia](/es/blog/competitor-price-tracking)).
- **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](/es/blog/squid-proxy-setup)).
- **Comprobaciones por país:** cada dominio de destino recibe el tipo de salida que necesita ([proxy residencial o de centro de datos](/es/blog/residential-vs-datacenter-proxy)).
- **Probar un proxy nuevo:** un dominio de prueba pasa por él mientras la navegación normal sigue siendo directa ([cómo probar un proxy](/es/blog/how-to-test-a-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](/es/blog/webrtc-dns-leak)).
- **Proxies locales:** un proxy de depuración en `127.0.0.1:8080` recibe solo los dominios que inspeccionas ([puerto 8080](/es/blog/port-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](/es/blog/proxy-server-not-responding).

- **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 exactamente `200`; un `404` es 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.** `isInNet` con un nombre de host, `dnsResolve` e `isResolvable` hacen 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ón `https://` en Chrome, porque la ruta se elimina. En nuestra prueba, el mismo tipo de regla sí coincidió con `http://`. Compara con `host`.
- **El punto en dnsDomainIs.** Sin él, coinciden los dominios parecidos; con él, el dominio a secas deja de coincidir.
- **Escribir `HTTP host:port` o un `SOCKS` a secas.** Chrome rechaza lo primero e interpreta lo segundo como SOCKS4.
- **Un respaldo `DIRECT` en 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](/es/blog/windows-chrome-proxy-settings)) |
| 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](/es/blog/windows-chrome-proxy-settings).

### ¿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](/es/proxy).
