Proxy Auto Config文件格式说明
PAC文件实际上是一个Script, 通过PAC我们可以让系统根据情况判断使用哪一个Proxy来访问目标网址, 这样做的好处:
- 分散Proxy的流量,避免Proxy Server负载过高
- 针对个别条件设定, 加快浏览速度
- 设定请求顺序, 自动依次尝试多个Proxy途径
PAC文件是纯文本, 格式和JavaScript一样, 不能包含任何HTML标签, 一定要定义的是Function FindProxyForURL
function FindProxyForURL(url, host) { ... }
一个完整的例子
var domains = { "google.com": 1, "facebook.com": 1, "bing.com":1 }; var proxy = "SOCKS5 127.0.0.1:1080; SOCKS 127.0.0.1:1080; DIRECT;"; var direct = 'DIRECT;'; function FindProxyForURL(url, host) { var lastPos; do { if (domains.hasOwnProperty(host)) { return proxy; } lastPos = host.indexOf('.') + 1; host = host.slice(lastPos); } while (lastPos >= 1); return direct; }
另一个例子
function FindProxyForURL(url, host) { url = url.toLowerCase(); host = host.toLowerCase(); if (isInNet(dnsResolve(host), "10.0.0.0", "255.0.0.0") || isInNet(dnsResolve(host), "172.16.0.0", "255.240.0.0") || isInNet(dnsResolve(host), "192.168.0.0", "255.255.0.0") || isInNet(dnsResolve(host), "127.0.0.0", "255.255.255.0") ) { return "DIRECT"; } if (shExpMatch(url,"*twitter*") || shExpMatch(url,"*google*") || shExpMatch(url,"*facebook*") || shExpMatch(url,"*blogspot*") || shExpMatch(url,"*youtube*") || shExpMatch(url,"*gstatic*") || shExpMatch(url,"*ytimg*") || shExpMatch(url,"*ggpht*") || shExpMatch(url,"*github*") ) { return "SOCKS 192.168.1.1:3128"; } return 'DIRECT'; }
如果使用了PAC, 则浏览器在接受我们要求的网址后会去执行ret = FindProxyForURL(url, host). 其中,
url是所要求网址的完整路径,
host是对方的计算机名称(就是在://和/之中的部份).
return值ret是Proxy的组态. 它的格式有下列三种:
- DIRECT: 直接联机而不透过Proxy
- PROXY host:port 使用指定的Proxy
- SOCKS host:port 使用指定的Socks代理
比如说当浏览器得到的是Proxy aa.bb.cc:3128; Proxy bb.cc.dd:3128; DIRECT 的话,那浏览器会先尝试aa.bb.cc:3128, 如果无法使用, 再尝试bb.cc.dd:3128, 还是不行的话, 就直接联机.
PAC中的预设函数
在PAC中,除了可以使用一般JavaScript的Function外, 它还定义了一些预设的函数
isPlainHostName(host)
host 由网址取得的主机名称.
此 Function 会判断 host 是否为不包含网域 (Domain). 如果不包含则 return true, 如果包含则 return false.
dnsDomainIs(host, domain)
host 由网址取得的主机名称.
domain 指定的网域.
此 Function 会判断 host 是否属于网域 domain. 如果是则 return true, 否则return false.
localHostOrDomainIs(host, hostdom)
host 由网址取得的主机名称.
hostdom 完整的网域名称.
此 Function 会判断 host 是否为 hostdom,或 host 是否为 hostdom 的主机名称. 如果是则 return true, 否则 return false.
isResolvable(host)
host 由网址取得的主机名称.
此 Function 会尝试透过 DNS 去解析 host,如果解析成功则 return true, 否则return false.
isInNet(host, pattern, mask)
host主机名称,可以是 Domain Name 或 IP. 如果是 Domain Name,则会透过 DNS 查出 IP.
pattern IP.
mask对应于pattern的遮盖.
此 Function 会 host 是否在指定的 IP 范围内,如果是则 return true, 否则 return false.
dnsResolve(host)
host 要透过 DNS 解晰的主机名称.
此 Function 会透过 DNS 去解析 host,return 值即为解析之结果.
myIpAddress()
此 Function 会 return 浏览器所在计算机之 IP 地址.
dnsDomainLevels(host)
host 由网址取得的主机名称.
此 Function 会 return host 的 Domain 层数(点的数目).
shExpMatch(str, shexp)
str 要进行比对的字符串.
shexp 比对的条件.
此 Function 会比对 str 是否符合 shexp 的表示式(此表示式为 shell expression 而非 regular expressions). 如果是则 return true, 否则 return false.
weekdayRange(), dateRange(), timeRange()
这三个函数的功用都是检查线在时间是否在指定范围内,可以设定分时段使用代理服务