Pergunta:
O que é um arquivo Proxy Pac? Há exemplos?
Ambiente: Cisco Web Security Appliance
Observação: este artigo da Base de conhecimento faz referência a softwares que não são mantidos ou suportados pela Cisco. As informações foram disponibilizadas como cortesia para sua conveniência. Para obter mais assistência, entre em contato com o fornecedor do software.
Link de referência: JavaScript ou arquivos de exemplo de proxy automático JScript
Arquivos de exemplo de proxy automático de JavaScript ou JScript
Os scripts a seguir fornecem exemplos de como um arquivo '.pac' pode ser usado para especificar um URL de proxy automático. Para usar essas funções, você deve alterar os nomes de proxy, os números de porta e os endereços IP.
- As funções isInNet, isResolvable e dnsResolve consultam um servidor DNS
- As referências a objetos, propriedades ou métodos do modelo de objeto causam uma falha silenciosa no arquivo de configuração automática do proxy. Por exemplo, as referências window.open(...), alert(...) e password(...) causam uma falha no arquivo de configuração automática do proxy no Internet Explorer.
Exemplo 1: Hosts locais se conectam diretamente, todos os outros se conectam via proxy
A função a seguir verifica se o nome de host é um host local e, nesse caso, se a conexão é direta. Se o nome de host não for um host local, a conexão ocorrerá por meio do proxy (proxy).
function FindProxyForURL(url, host)
{
if (isPlainHostName(host))
return "DIRECT";
else
return "PROXY proxy:80";
}
A função isPlainHostName verifica se há pontos no nome de host. Nesse caso, retorna false; caso contrário, a função retorna true.
Observação: para uma conexão direta com o servidor Web local, uma correspondência de domínio ou sub-rede também pode ser necessária. Nem todas as solicitações para os servidores da Web locais são feitas usando apenas nomes de host
Exemplo 2: Hosts dentro do firewall se conectam diretamente, servidores locais externos se conectam via proxy
A função a seguir verifica se o host é um nome de host "simples" (ou seja, o nome de domínio não está incluído) ou faz parte de um domínio específico (.company.com), mas o nome de host não é www nem home.
function FindProxyForURL(url, host)
{
if ((isPlainHostName(host) ||
dnsDomainIs(host, ".company.com")) &&
!localHostOrDomainIs(host, "www.company.com") &&
!localHostOrDoaminIs(host, "home.company.com"))
return "DIRECT";
else
return "PROXY proxy:80";
}
Note:
- A função localHostOrDomainIs é executada somente para URLs no domínio local.
- A função dnsDomainIs retornará true, se o domínio do nome de host corresponder ao domínio fornecido.
Exemplo 3: se o host for resolvível, conecte-se diretamente. Caso contrário, conecte-se usando um proxy.
A função a seguir solicita que o servidor DNS tente resolver o nome de host informado. Se possível, será feita uma conexão direta. Caso contrário, a conexão será feita por meio do proxy. Isso é útil quando um servidor DNS interno é usado para resolver todos os nomes de host internos.
function FindProxyForURL(url, host)
{
if (isResolvable(host))
return "DIRECT";
else
return "PROXY proxy:80";
}
Consulte a observação na função isResolvable na parte superior da página.
Exemplo 4: se o host estiver na sub-rede especificada, conecte-se diretamente. Caso contrário, conecte-se usando um proxy.
A função a seguir compara determinado padrão de endereço IP e a máscara com o nome de host. Isso será útil, caso determinados hosts em uma sub-rede sejam conectados diretamente e outros sejam conectados usando um proxy.
function FindProxyForURL(url, host)
{
if (isInNet(host, "999.99.9.9", "255.0.255.0"))
return "DIRECT";
else
return "PROXY proxy:80";
}
Consulte a observação na função isInNet na parte superior da página.
A função isInNet (host, padrão, máscara) retornará true, se o endereço IP do host corresponder ao padrão especificado. A máscara indica qual parte do endereço IP deve ser correspondida (255 = corresponder, 0 = ignorar).
Exemplo 5: Determinar o tipo de conexão com base no domínio do host
A função a seguir especifica uma conexão direta, se o host for local. Se o host não for local, essa função determinará qual proxy usar de acordo com o domínio de host. Isso será útil, caso o nome de domínio de host seja um dos critérios para a seleção de proxy.
function FindProxyForURL(url, host)
{
if (isPlainHostName(host))
return "DIRECT";
else if (shExpMatch(host, "*.com"))
return "PROXY comproxy:80";
else if (shExpMatch(host, "*.edu"))
return "PROXY eduproxy:80";
else
return "PROXY proxy";
}
A função shExpMatch (str, shexp) retornará true, se str corresponder ao shexp usando os padrões de expressão de shell.
Exemplo 6: Determine o tipo de conexão com base no protocolo que está sendo usado
A função a seguir extrai o protocolo usado e faz uma seleção de proxy de acordo. Se não houver correspondência no protocolo, uma conexão direta será estabelecida. Isso será útil, caso o protocolo usado seja um dos critérios para a seleção de proxy.
function FindProxyForURL(url, host)
{
if (url.substring(0, 5) == "http:") {
return "PROXY proxy:80";
}
else if (url.substring(0, 4) == "ftp:") {
return "PROXY fproxy:80";
}
else if (url.substring(0, 7) == "gopher:") {
return "PROXY gproxy";
}
else if (url.substring(0, 6) == "https:") {
return "PROXY secproxy:8080";
}
else {
return "DIRECT";
}
}
A função de substring extrai o número especificado de caracteres de uma string.
Exemplo 7: Determine a configuração do proxy verificando se o nome do host corresponde ao endereço IP
A função a seguir faz uma seleção de proxy, convertendo o nome de host em um endereço IP e comparando-o a uma string especificada.
function FindProxyForURL(url, host)
{
if (dnsResolve(host) == "999.99.99.999") { // = http://proxy
return "PROXY secproxy:8080";
}
else {
return "PROXY proxy:80";
}
}
Consulte a observação na função dnsResolve na parte superior da página.
Exemplo 8: se o IP do host corresponder ao IP especificado, conecte-se via proxy, ou conecte-se diretamente
A função a seguir é outra maneira de fazer uma seleção de proxy de acordo com a especificação de um endereço IP. Este exemplo, ao contrário do exemplo 7, usa a chamada de função para obter explicitamente o endereço IP numérico (o exemplo 7 usa a função dnsResolve para converter o nome de host no endereço IP numérico).
function FindProxyForURL(url, host)
{
if (arquipadres() == "999.99.999.99") {
return "PROXY proxy:80";
}
else {
return "DIRECT";
}
}
A função myIpAddress retorna o endereço IP (no formato de ponto de número inteiro) do host em que o navegador está sendo executado.
Exemplo 9: se houver pontos no nome do host, conecte-se usando um proxy. Caso contrário, conecte-se diretamente.
A função a seguir verifica quantos pontos há no nome de host. Se houver pontos no nome de host, faça uma conexão por meio do proxy. Se não houver pontos no nome de host, faça uma conexão direta. Essa é outra maneira de determinar os tipos de conexão de acordo com as características do nome de host.
function FindProxyForURL(url, host)
{
if (dnsDomainLevels(host) > 0) { // if the number of dots in host > 0
return "PROXY proxy:80";
}
return "DIRECT";
}
A função dnsDomainLevels retorna um número inteiro igual ao número de pontos no nome de host.
Exemplo 10: Especificar dias da semana para conexão via proxy, outros dias para conexão direta
A função a seguir determina o tipo de conexão especificando os dias da semana apropriados para um proxy. Os dias que não atendem a esses parâmetros usam uma conexão direta. Essa função pode ser útil nas situações em que pode ser conveniente usar um proxy, quando o tráfego for intenso, e permitir uma conexão direta, quando o tráfego for leve.
function FindProxyForURL(url, host)
{
if(weekdayRange("WED", "SAT", "GMT"))
return "PROXY proxy:80";
else
return "DIRECT";
}
A função weekdayRange(day1 [,day2] [,GMT] ) retornará se a hora atual do sistema está dentro do intervalo especificado pelos parâmetros day1, day2 e GMT. Somente o primeiro parâmetro é necessário. O parâmetro GMT pressupõe que os valores de hora estão no horário de Greenwich, em vez do fuso horário local.
Exemplo 11: Balanceamento de carga com uma função Math simples
function FindProxyForURL(url, host){
return randomProxy();
}
function randomProxy()
{
switch( Math.floor( Math.random() *2))
{
caso 0: retorne "PROXY 1.1.1.1:3128; PROXY 2.2.2.2; PROXY DIRETO;"
caso 1: retorne "PROXY 2.2.2.2:3128; PROXY 1.1.1.1; PROXY DIRETO;"
}
}
Você verá que os casos também implementam um failover, se um proxy não estiver disponível.