PAC file example
From Tech-Wiki
More actions
Example Proxy Auto-Configuration (PAC) file showing direct-access rules, proxy selection, internal-network bypasses and simple source-based proxy balancing.
Example only
Replace the example domains, networks and proxy names with values appropriate to the target environment. Test PAC changes carefully because an error can affect browser/network connectivity for every client that receives the file.
Behaviour demonstrated
The sample shows how to:
- Send plain host names and private-address destinations directly.
- Route selected sites through a proxy.
- Bypass RFC1918/internal ranges.
- Send FTP directly.
- Bypass selected domains.
- Match host patterns.
- Select proxy order based on the client address.
- Provide a default proxy chain with a direct fallback.
PAC file
function FindProxyForURL(url, host) {
var privateIP = /^(0|10|127|192\.168|172\.1[6789]|172\.2[0-9]|172\.3[01]|169\.254|192\.88\.99)\.[0-9.]+$/;
var resolved_ip = dnsResolve(host);
var myIp = myIpAddress();
/* Don't send non-FQDN or private IP auths to us */
// note this will defeat host file entries for external systems
if (isPlainHostName(host) || privateIP.test(host)) {
return "DIRECT";
}
if (dnsDomainIs(host, "www.acme.com") ||
dnsDomainIs(host, "webmail.acme.com"))
return "PROXY proxy.acme.com:3128; DIRECT";
/*If the host is an internal IP range (RFC1918), send direct */
if (isInNet(resolved_ip, "10.0.0.0", "255.0.0.0") ||
isInNet(resolved_ip, "172.16.0.0", "255.240.0.0") ||
isInNet(resolved_ip, "192.168.0.0", "255.255.0.0") ||
isInNet(resolved_ip, "127.0.0.0", "255.255.255.0"))
return "DIRECT";
/* FTP goes directly */
if (url.substring(0,4) == "ftp:") {
return "DIRECT";
}
// Domains to bypass
if ((host == "webmail.acme.com") ||
(host == "www.acme.com") ||
(dnsDomainIs(host, "sso.acme.com")))
return "DIRECT";
if (shExpMatch(host, "*.microsoft.com") ||
shExpMatch(host, "*windowsupdate*"))
return "PROXY proxy.acme.com:3128; DIRECT";
// Balancing based on source
if (isInNet(myIp, "10.1.0.0", 255.255.255.0") ||
isInNet(myIp, "10.2.0.0", 255.255.255.0"))
return "PROXY proxy2:8080; PROXY proxy1:8080; DIRECT";
// Load balancing
var ipBits = myIp.split(".");
var mySeg = parseInt(ipBits[3]);
// Modulus % 2
if((mySeg % 2) == 0) // Even
return "PROXY proxy1:8080; PROXY proxy2:8080;";
else
return "PROXY proxy2:8080; PROXY proxy1:8080;";
/* Default Traffic Forwarding */
return "PROXY proxy1.acme.com:8080; PROXY proxy2.acme.com:8080; DIRECT";
}