奶牛老爹 2011-04-19
转自http://www.cnblogs.com/ttyp/archive/2005/11/18/279124.html
一个PAC文件其实就是一个文本文件,最简单的格式就是包含一个叫FindProxyForURL的JScript函数,IE通过传入两个变量来调用这个函数,一个是用户浏览的地址URL全路经,一个是这个URL中的主机名部分(host)。
这个FindProxyForURL函数有三种可能的字符串返回值,
一是"DIRECT",就是直接连接,不通过代理;
二是"PROXYproxyaddr:port",其中proxyaddr和port分别是代理的地址和代理的端口;
三是"SOCKSsocksaddr:port",其中socksaddr和port分别是socks代理的地址和端口,
一个自动代理文件可以是多个选择的组合,其中用分号(;)隔开。
PAC内置语法见http://wp.netscape.com/eng/mozilla/2.0/relnotes/demo/proxy-live.html
PAC脚本另外一个重要的应用是多台代理服务器并存的情况下,通过pac脚本的控制:
*用户随机选择使用多台代理服务器中的任意一台来达到流量负载均衡的目的;
*管理员通过PAC脚本控制用户使用和不使用某台代理服务器,这样可以空出时间对代理服务器进行维护;
*让服务器工作在主备模式,当主服务器宕机时,会自动切换到其它备用服务器而不会中断服务;
*根据访问目的地的不同,自动选择最佳代理服务器。
下面列举几个PAC的实例,顺便学习下它的语法
A、isPlainHostName(host),本例演示判断是否为本地主机,如http://myservername/的方式访问,如果是直接连接,否则使用代理
function FindProxyForURL(url, host) { if (isPlainHostName(host)) return "DIRECT"; else return "PROXY proxy:80"; }
B、dnsDomainIs(host,"")、localHostOrDomainIs(host,""),本例演示判断访问主机是否属于某个域和某个域名,如果属于.company.com域的主机名,而域名不是www.company.com和home.company.com的直接连接,否则使用代理访问。
function FindProxyForURL(url, host) { if ((isPlainHostName(host) || dnsDomainIs(host, ".company.com")) && !localHostOrDomainIs(host, "www.company.com") && !localHostOrDomainIs(host, "home.company.com")) return "DIRECT"; else return "PROXY proxy:80"; }
C、isResolvable(host),本例演示主机名能否被dns服务器解析,如果能直接访问,否则就通过代理访问。
function FindProxyForURL(url, host) { if (isResolvable(host)) return "DIRECT"; else return "PROXY proxy:80"; }
D、isInNet(host,"",""),本例演示访问IP是否在某个子网内,如果是就直接访问,否则就通过代理,例子演示访问清华IP段的主页不用代理。
function FindProxyForURL(url, host) { if (isInNet(host, "166.111.0.0", "255.255.0.0")) return "DIRECT"; else return "PROXY proxy:80"; }
E、shExpMatch(host,""),本例演示根据主机域名来改变连接类型,本地主机、*.edu、*.com分别用不同的连接方式。
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:80"; }
F、url.substring(),本例演示根据不同的协议来选择不同的代理,http、https、ftp、gopher分别使用不同的代理。
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"; } }
G、dnsResolve(host),本例演示判断访问主机是否某个IP,如果是就使用代理,否则直接连接。
function FindProxyForURL(url, host) { if (dnsResolve(host) == "166.111.8.237") { return "PROXY secproxy:8080"; } else { return "PROXY proxy:80"; } }
H、myIpAddress(),本例演示判断本地IP是否某个IP,如果是就使用代理,否则直接使用连接。
function FindProxyForURL(url, host) { if (myIpAddress() == "166.111.8.238") { return "PROXY proxy:80"; } else { return "DIRECT"; } }
I、dnsDomainLevels(host),本例演示访问主机的域名级数是几级,就是域名有几个点如果域名中有点,就通过代理访问,否则直接连接。
function FindProxyForURL(url, host) { if (dnsDomainLevels(host) > 0) { // if number of dots in host > 0 return "PROXY proxy:80"; } return "DIRECT"; }
J、weekdayRange(),本例演示当前日期的范围来改变使用代理,如果是GMT时间周三到周六,使用代理连接,否则直接连接。
function FindProxyForURL(url, host) { if(weekdayRange("WED", "SAT", "GMT")) return "PROXY proxy:80"; else return "DIRECT"; }
K、最后一个例子是演示随机使用代理,这样可以好好利用代理服务器。
function FindProxyForURL(url,host) { return randomProxy(); } function randomProxy() { switch( Math.floor( Math.random() * 5 ) ) { case 0: return "PROXY proxy1:80"; break; case 1: return "PROXY proxy2:80"; break; case 2: return "PROXY proxy3:80"; break; case 3: return "PROXY proxy4:80"; break; case 4: return "PROXY proxy5:80"; break; } }