---
title: "O que é um arquivo PAC? FindProxyForURL, sintaxe e exemplos"
description: "Um arquivo PAC é um pequeno arquivo JavaScript que diz ao navegador se cada URL vai direto ou por um proxy. Veja FindProxyForURL, WPAD e erros comuns."
url: https://proxynet.io/pt-br/blog/pac-file
date: 2026-09-24
author: "Acar Diveroli"
category: "Tutoriais, Proxy 101"
lang: pt-BR
---

# O que é um arquivo PAC? FindProxyForURL, sintaxe e exemplos

Uma pequena equipe de monitoramento de preços configura um proxy residencial como proxy do sistema no Windows. Poucos dias depois, a página de consumo mostra muito mais gigabytes do que o trabalho deveria gastar. Atualizações do navegador, videochamadas e o webmail também passaram pelo proxy, embora só duas lojas concorrentes precisassem ser vistas de outro endereço IP. A equipe precisava de uma regra que dissesse "estes sites pelo proxy, todo o resto direto". Essa regra é um arquivo PAC.

Este guia explica o que é um arquivo PAC (arquivo de configuração automática de proxy, do inglês proxy auto-config), como o navegador o executa e o que `FindProxyForURL` pode retornar. Ele cobre as funções auxiliares e suas armadilhas, um exemplo testado que manda só os sites de destino por um proxy, o WPAD e seus riscos, por que o arquivo não pode guardar uma senha e como a mesma regra reduz o tráfego de proxy.

> **Nota: Resposta rápida**
>
> Um arquivo PAC é um pequeno arquivo JavaScript com uma única função, `FindProxyForURL(url, host)`, que o navegador chama antes de cada requisição. Se ela retorna `"DIRECT"`, o navegador se conecta sozinho; se retorna `"PROXY host:port"` ou `"SOCKS5 host:port"`, a requisição passa por esse proxy. Dá para listar várias opções separadas por ponto e vírgula, e o navegador as tenta da esquerda para a direita. Você serve o arquivo a partir de um endereço web e coloca esse endereço nas configurações do sistema ou do navegador; o WPAD procura esse endereço na rede automaticamente. O arquivo não pode levar usuário nem senha, por isso combina bem com a autenticação por whitelist de IP.

## O que é um arquivo PAC?

Um arquivo PAC é um arquivo JavaScript em texto puro que define uma única função: `FindProxyForURL(url, host)`. A função recebe o endereço que o navegador está prestes a abrir e retorna uma string que indica a rota. A Netscape adicionou a configuração automática de proxy ao Navigator 2.0, a mesma versão que introduziu o JavaScript.

O PAC não tem RFC nem especificação formal. Cada navegador traz a sua própria implementação, e os detalhes variam. A [referência do MDN sobre arquivos PAC](https://developer.mozilla.org/en-US/docs/Web/HTTP/Guides/Proxy_servers_and_tunneling/Proxy_Auto-Configuration_PAC_file) (em inglês) descreve o terreno comum, incluindo o tipo MIME, `application/x-ns-proxy-autoconfig`. O arquivo geralmente termina em `.pac`; quando é encontrado via WPAD, ele se chama `wpad.dat`.

Uma configuração manual de proxy manda todo o tráfego para um único proxy. Um arquivo PAC decide de novo a cada requisição, então o mesmo navegador pode acessar uma loja por um proxy e a wiki do escritório diretamente.

## Como o navegador usa um arquivo PAC?

1. **Busca o arquivo.** O navegador o baixa do endereço que você informou ou do endereço que o WPAD encontrou. O Chrome busca o arquivo diretamente, nunca por um proxy, e precisa de uma resposta HTTP `200` em até 30 segundos, com um corpo menor que 1 MB.
2. **Chama a função antes de cada requisição.** Em endereços `https://`, o Chrome remove antes o caminho e a query string, então a função vê `https://store.example/`, e não o endereço completo. O Chrome começou a fazer isso na versão 52 e, desde a versão 75, não é possível desativar.
3. **Lê a resposta da esquerda para a direita.** A string é dividida nos pontos e vírgulas. O navegador tenta a primeira entrada e só passa para a seguinte se esse proxy não puder ser alcançado.
4. **Deixa de lado um proxy que falhou.** Ele vai para o fim da lista por um tempo. Quanto tempo depende do navegador, então não monte regras em torno de um tempo fixo.
5. **Recorre a uma alternativa quando o arquivo falta.** Se o Chrome não consegue baixar o arquivo, ele passa para a próxima opção, geralmente uma conexão direta, sem nenhum aviso. Só um script PAC marcado como obrigatório faz as requisições falharem em vez disso. No nosso teste, um arquivo com erro de sintaxe também mandou o Chrome para a conexão direta.

As regras completas estão na [documentação de suporte a proxy do Chromium](https://chromium.googlesource.com/chromium/src/+/HEAD/net/docs/proxy.md) (em inglês).

## O que FindProxyForURL pode retornar?

A função retorna uma única string. Cada entrada é uma palavra-chave seguida, no caso dos proxies, de `host:port`.

| Valor retornado | O que faz | Suporte (fonte) | Atenção |
|---|---|---|---|
| `DIRECT` | Conecta sem proxy | Palavra-chave padrão (MDN) | Como reserva em uma regra de destino, envia a requisição a partir do seu IP real |
| `PROXY pr.proxynet.io:8000` | Usa um proxy HTTP | Palavra-chave padrão (MDN, Chromium) | Se o proxy pedir senha, o navegador mostra uma janela de login `407` |
| `SOCKS5 pr.proxynet.io:1080` | Usa um proxy SOCKS5 | Chrome e Firefox (Chromium, MDN) | O Chrome não envia credenciais SOCKS5, então o proxy precisa liberar o seu IP |
| `HTTPS proxy.example:443` | Usa um proxy que você alcança por TLS | Chrome e Firefox (Chromium, MDN) | O proxy precisa falar TLS nessa porta |
| `SOCKS proxy.example:1080` | Usa um servidor SOCKS | Palavra-chave padrão (MDN) | O Chrome lê um `SOCKS` sozinho como SOCKS4 |

O Firefox também aceita `HTTP host:port` e `SOCKS4 host:port`, mas o parser do Chrome não conhece `HTTP`, então `PROXY` é a grafia que funciona em todos. O Chrome lê as palavras-chave em maiúsculas ou minúsculas; o MDN as escreve em maiúsculas, e nós também.

Uma cadeia como `"PROXY a.example:8000; PROXY b.example:8000; DIRECT"` significa: tente o primeiro proxy, depois o segundo, e conecte diretamente só se os dois estiverem fora do ar. Esse último passo serve para a navegação em geral e é errado para coleta de dados. A diferença de protocolo entre os dois tipos de proxy está em [Diferença entre SOCKS e HTTP proxy](/pt-br/blog/socks-vs-http-proxy).

## Quais funções auxiliares um arquivo PAC pode usar?

As funções embutidas se dividem em dois grupos.

**Verificações de string, rápidas e seguras:** `shExpMatch` (padrões com `*` e `?` no estilo do shell), `dnsDomainIs`, `isPlainHostName` (nome sem ponto), `localHostOrDomainIs`, `dnsDomainLevels` e as funções de tempo `weekdayRange`, `dateRange` e `timeRange`.

**Funções que consultam o DNS:** `dnsResolve`, `isResolvable` e `isInNet` quando recebe um nome de host em vez de um endereço IP. O MDN avisa que elas precisam consultar o servidor DNS e raramente são necessárias.

Verificamos três armadilhas comuns com o pacparser, que executa arquivos PAC no motor QuickJS:

- `dnsDomainIs(host, "shop.example")` só compara o fim da string, então `evilshop.example` também corresponde.
- `dnsDomainIs(host, ".shop.example")` corrige isso, mas o `shop.example` sozinho deixa de corresponder. Verifique os dois: `host === "shop.example" || dnsDomainIs(host, ".shop.example")`.
- `shExpMatch(host, "*.panel.example")` não corresponde ao próprio `panel.example`.

`myIpAddress()` pode retornar o endereço errado em uma máquina com várias interfaces de rede, então evite regras que dependam do IP da própria máquina.

## Como escrever um arquivo PAC que manda só os sites de destino pelo proxy

Este é o cenário da introdução em um único arquivo. Os destinos do monitoramento de preços e os subdomínios deles passam por um [Proxies residenciais](https://proxynet.io/pt-br/residential-proxy). Um painel que precisa manter um único endereço passa por um proxy SOCKS5, com um proxy HTTP de reserva. Todo o resto vai direto. Troque os domínios `.example` pelos seus.

```js
// proxy.pac: só os sites da lista usam proxy, todo o resto vai direto.
function FindProxyForURL(url, host) {
  host = host.toLowerCase();

  // 1. Nomes simples (intranet, impressora) e localhost: sempre direto.
  if (isPlainHostName(host) || host === "localhost") {
    return "DIRECT";
  }

  // 2. Endereços IP privados e de loopback: direto. A checagem com regex
  //    garante que isInNet só receba um endereço IP e nunca consulte o 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. Destinos do monitoramento de preços e seus subdomínios: proxy residencial.
  //    Sem "; DIRECT" no fim: se o proxy cair, a requisição falha
  //    em vez de sair do seu próprio endereço 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. Um painel que precisa manter um único IP: SOCKS5 primeiro, HTTP como reserva.
  //    Coloque aqui o host e as portas do seu 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 o resto: direto.
  return "DIRECT";
}
```

O host é convertido para minúsculas primeiro, porque as funções auxiliares comparam strings de forma exata. O `isInNet` só roda depois que a regex confirmou um endereço IP, então o script nunca espera pelo DNS. O código fica em `var` e loops simples, porque nem todo motor PAC executa JavaScript moderno. Em um arquivo PAC, a cadeia com ponto e vírgula é o mecanismo de nova tentativa; a lógica de novas tentativas em código fica no scraper ([Códigos de status HTTP no web scraping](/pt-br/blog/http-status-codes-web-scraping)).

### Como testamos

Rodamos o arquivo no pacparser 1.5.2, com Python 3.13, contra dez hosts, e cada um retornou a rota esperada, incluindo `WWW.Shop.Example` (proxy) e `notshop.example` (direto). Depois servimos o arquivo localmente com o tipo `application/x-ns-proxy-autoconfig`, apontamos os endpoints para dois proxies de teste locais e abrimos o Chrome 154 com `--proxy-pac-url`. Os hosts de destino chegaram ao proxy HTTP e os outros foram direto. Para o painel, o Chrome tentou primeiro o SOCKS5, oferecendo só o método "sem autenticação", e depois passou para a reserva HTTP. Uma cópia com uma chave faltando mandou todas as requisições direto, sem aviso.

## Como apontar um dispositivo ou navegador para um arquivo PAC?

Sirva o arquivo a partir de um servidor web, por HTTPS sempre que puder, com o `Content-Type` que o MDN pede. Depois informe o endereço dele:

- **Windows:** a opção **Usar script de configuração**; os passos estão em [configuração de proxy no Windows e no Chrome](/pt-br/blog/windows-chrome-proxy-settings).
- **Mac:** a linha **Configuração automática de proxy**; veja [quando usá-la no Mac](/pt-br/blog/mac-safari-proxy-settings).
- **Android:** a opção **Autoconfiguração do proxy** na rede Wi-Fi ([configurações de proxy no Android](/pt-br/blog/android-proxy-settings)).
- **Firefox:** **URL de configuração automática de proxy** nas configurações de conexão ([configurações de proxy no Firefox](/pt-br/blog/firefox)).

Para alternar entre alguns perfis dentro de um único navegador, uma extensão costuma ser mais simples ([SwitchyOmega](/pt-br/blog/switchy-omega)). Se você encontrou um endereço PAC em um computador do trabalho, veja [como encontrar o endereço do servidor proxy](/pt-br/blog/find-proxy-server-address).

## O que é WPAD e por que é um risco?

O WPAD (Web Proxy Auto-Discovery) está por trás da opção "Detectar configurações automaticamente": o cliente procura um arquivo PAC na rede. O [rascunho do WPAD](https://datatracker.ietf.org/doc/html/draft-ietf-wrec-wpad-01), de 1999, lista vários métodos de descoberta, e os clientes usam principalmente dois: a opção 252 do DHCP, que entrega a URL, e consultas DNS por um host chamado `wpad`. Uma máquina chamada `pc1.sales.corp.example` pergunta por `wpad.sales.corp.example`, depois por `wpad.corp.example`, e pede `/wpad.dat` ao primeiro nome que responder. O Chrome tenta o DHCP antes do DNS, mas só oferece o método DHCP no Windows e no ChromeOS. O rascunho expirou sem virar RFC.

O cliente confia em quem responder. Se um notebook configurado para detecção automática entra na rede de um café, ou se a consulta WPAD dele vaza para o DNS público, o servidor de um desconhecido pode entregar a ele um arquivo PAC e rotear o tráfego do notebook. O alerta [TA16-144A](https://www.cisa.gov/news-events/alerts/2016/05/23/wpad-name-collision-vulnerability) da CISA explica como os novos domínios de primeiro nível facilitaram essas colisões de nomes.

Para proteger as suas máquinas:

- Desligue a detecção automática onde ela não for necessária, principalmente em notebooks que saem do escritório.
- Informe o endereço PAC explicitamente, por HTTPS.
- No Windows 10 versão 1809, no Windows Server 2019 e em versões posteriores, defina o valor de registro `DisableWpad` como `1`, como a [Microsoft documenta](https://learn.microsoft.com/en-us/troubleshoot/windows-server/networking/disable-http-proxy-auth-features), e desligue também a detecção nas Configurações, porque os navegadores leem essa opção.
- Registre e bloqueie no firewall as requisições de saída para `wpad.dat`, como a CISA sugere ([Proxy ou firewall](/pt-br/blog/proxy-vs-firewall)).

## Por que um arquivo PAC não pode guardar usuário e senha?

Um arquivo PAC responde a uma única pergunta: para onde esta requisição deve ir? Ele retorna uma palavra-chave, um host e uma porta, sem nenhum campo para credenciais.

Se um proxy HTTP pede senha, ele responde `407` e o navegador mostra uma janela de login. O Chrome não oferece nenhum método de autenticação para SOCKS5, então uma entrada SOCKS5 só funciona quando o proxy libera o seu IP. Para trabalhos automatizados e SOCKS5, a autenticação por whitelist de IP é o caminho prático: você adiciona o seu IP de saída à lista de permitidos na sua conta de proxy. Não coloque credenciais em URLs para contornar o problema. Os dois métodos, incluindo o que acontece quando o seu IP muda, estão comparados em [Autenticação de proxy: user:pass ou whitelist de IP](/pt-br/blog/proxy-authentication-methods).

## Como um arquivo PAC reduz o tráfego e o custo do proxy?

Proxies residenciais e móveis são cobrados por gigabyte; proxies ISP e de datacenter, por endereço IP. Com um proxy no sistema inteiro, atualizações, videochamadas e downloads também entram na conta. Um arquivo PAC manda só os domínios de destino pelo proxy residencial, então os gigabytes cobrados correspondem ao trabalho.

Para um painel que precisa manter um único endereço entre sessões, um produto cobrado por IP se encaixa melhor: um [Proxies ISP](https://proxynet.io/pt-br/static-isp-residential-proxy) ou um [Proxies SOCKS5](https://proxynet.io/pt-br/socks5-proxy) com o seu IP na whitelist.

## Casos de uso

- **Monitoramento de preços:** só as lojas que você acompanha usam o proxy, dentro das regras do `robots.txt` delas e com uma taxa de requisições moderada ([monitoramento de preços da concorrência](/pt-br/blog/competitor-price-tracking)).
- **Redes de escritório:** endereços internos vão direto, e o tráfego externo passa por um proxy da empresa, como o Squid ([configuração do Squid proxy](/pt-br/blog/squid-proxy-setup)).
- **Verificações por país:** cada domínio de destino recebe o tipo de saída de que precisa ([proxy residencial ou datacenter](/pt-br/blog/residential-vs-datacenter-proxy)).
- **Testar um proxy novo:** um domínio de teste passa por ele enquanto a navegação normal continua direta ([como testar um proxy](/pt-br/blog/how-to-test-a-proxy)).
- **Verificação de vazamentos:** uma regra PAC cobre as requisições do navegador, mas o WebRTC e o DNS ainda podem revelar o seu endereço ([vazamentos de WebRTC e DNS](/pt-br/blog/webrtc-dns-leak)).
- **Proxies locais:** um proxy de depuração em `127.0.0.1:8080` recebe só os domínios que você inspeciona ([porta 8080](/pt-br/blog/port-8080)).

## Erros comuns

Estes erros são específicos de arquivos PAC; para erros de conexão em geral, veja [Servidor proxy não está respondendo](/pt-br/blog/proxy-server-not-responding).

- **Tipo MIME errado ou arquivo ausente.** O MDN pede que os servidores enviem `application/x-ns-proxy-autoconfig`. O Chrome também exige exatamente `200`; um `404` é uma busca que falhou e vira conexão direta.
- **Não ver mudança depois de editar.** Os navegadores mantêm o script carregado na memória. Use **Recarregar** nas configurações de conexão do Firefox, **Re-apply settings** em `chrome://net-internals/#proxy` ou reinicie o navegador.
- **Consultar o DNS no script.** `isInNet` com nome de host, `dnsResolve` e `isResolvable` fazem uma consulta por requisição, e um servidor DNS lento faz toda página esperar.
- **Erro de sintaxe.** O Chrome vai direto sem mensagem. Teste o arquivo com o pacparser antes de colocá-lo em produção.
- **Regras de caminho em HTTPS.** `shExpMatch(url, "*/products/*")` nunca corresponde a um endereço `https://` no Chrome, porque o caminho é removido. No nosso teste, o mesmo tipo de regra correspondeu em `http://`. Faça a correspondência pelo `host`.
- **O ponto no dnsDomainIs.** Sem ele, domínios parecidos correspondem; com ele, o domínio sozinho não corresponde.
- **Escrever `HTTP host:port` ou um `SOCKS` sozinho.** O Chrome rejeita o primeiro e lê o segundo como SOCKS4.
- **Uma reserva `DIRECT` em destinos de coleta de dados.** Quando o proxy cai, o site vê o seu próprio IP.

## Guia de decisão

| Necessidade | Recomendação |
|---|---|
| Mandar só alguns domínios por um proxy | Um arquivo PAC: `PROXY` para os destinos, `DIRECT` para o resto |
| Todo o tráfego do navegador por um único proxy | Não precisa de PAC; um proxy manual no sistema basta ([Windows e Chrome](/pt-br/blog/windows-chrome-proxy-settings)) |
| O seu IP real nunca pode chegar a um site de destino | Retorne só `PROXY` para ele, sem a reserva `; DIRECT` |
| Usar SOCKS5 no Chrome | Retorne `SOCKS5 host:port` e coloque o seu IP na whitelist |
| O mesmo endereço PAC em todos os computadores do escritório | Distribua por política ou gerenciamento de dispositivos; se usar WPAD, proteja o DHCP e o DNS |
| Um notebook também é usado em redes de cafés e de casa | Desligue a detecção automática; defina `DisableWpad` no Windows |
| Um painel precisa do mesmo IP em toda sessão | Aponte esse domínio para um proxy ISP estático |

## Perguntas frequentes

### Como abrir ou editar um arquivo PAC?

Um arquivo PAC é texto puro, então o Bloco de Notas ou qualquer editor de código o abre. Um navegador que abre a URL mostra o texto ou baixa o arquivo, conforme o tipo MIME. Outros formatos usam a mesma extensão `.pac`; se o arquivo parecer dados binários, ele não é uma configuração de proxy.

### Onde fica o arquivo PAC no Windows?

Geralmente ele não é um arquivo local. O Windows guarda o endereço informado em **Usar script de configuração** e baixa o arquivo de lá. Os passos para ver ou alterar esse endereço estão em [configuração de proxy no Windows e no Chrome](/pt-br/blog/windows-chrome-proxy-settings).

### Um arquivo PAC pode incluir usuário e senha?

Não. A função retorna só uma palavra-chave, um host e uma porta. Para um proxy HTTP, o navegador pede as credenciais em uma janela `407`; para trabalhos automatizados e SOCKS5, use a autenticação por whitelist de IP.

### Qual é a diferença entre PAC e WPAD?

O arquivo PAC contém as regras. O WPAD encontra o endereço de um arquivo PAC na rede local via DHCP ou DNS. Você pode usar um arquivo PAC sem WPAD informando o endereço você mesmo, o que também é a opção mais segura.

### Um arquivo PAC pode retornar um proxy SOCKS5?

Sim, como `SOCKS5 host:port`; o Chrome e o Firefox seguem essa entrada. O Chrome não envia credenciais SOCKS5, então coloque o seu IP na whitelist do proxy.

### Mudei o meu arquivo PAC. Por que o navegador ainda usa as regras antigas?

O navegador mantém a versão que carregou até recarregar a configuração. Clique em **Recarregar** no Firefox, use **Re-apply settings** em `chrome://net-internals/#proxy` ou reinicie o navegador. Um nome de arquivo novo para cada versão (`proxy-v2.pac`) elimina a dúvida.

## Em resumo

Um arquivo PAC transforma o proxy de um interruptor liga/desliga em uma decisão para cada requisição: `FindProxyForURL` olha o host e retorna `DIRECT`, `PROXY` ou `SOCKS5`, e o navegador tenta as entradas da esquerda para a direita. Faça a correspondência pelo `host`, evite funções que consultam o DNS e deixe a reserva `DIRECT` fora das regras para destinos de coleta de dados. Informe você mesmo o endereço PAC, por HTTPS, e desligue o WPAD onde ele não for necessário. Como o arquivo não pode guardar senha, combine-o com a autenticação por whitelist de IP e escolha o tipo de proxy de cada regra nos nossos [serviços de proxy](/pt-br/proxy).
