Proxy Auto Config文件格式说明
PAC文件实际上是一个Script, 通过PAC我们可以让系统根据情况判断使用哪一个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
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), "172.1.1.0", "255.255.255.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,"*.jove.com*")
|| shExpMatch(url,"*springer.com*")
|| shExpMatch(url,"*cnki.net*")
|| shExpMatch(url,"*reaxys.com*")
) {
return "PROXY 192.168.1.124:808";
}
if (shExpMatch(url,"*jstor.org*")
|| shExpMatch(url,"*sciencemag.org*")
|| shExpMatch(url,"*bioone.org*")
|| shExpMatch(url,"*webofknowledge.com*")
|| shExpMatch(url,"*oup.com*")
|| shExpMatch(url,"*nature.com*")
|| shExpMatch(url,"*annualreviews.org*")
|| shExpMatch(url,"*f1000.com*")
|| shExpMatch(url,"*rsc.org*")
|| shExpMatch(url,"*acs.org*")
|| shExpMatch(url,"*wiley.com*")
|| shExpMatch(url,"*cell.com*")
|| shExpMatch(url,"*sciencedirect.com*")
|| shExpMatch(url,"*discoverygate.com*")
|| shExpMatch(url,"*f1000biology.com*")
|| shExpMatch(url,"*journalsonline.tandf.co.uk*")
|| shExpMatch(url,"*blackwell-synergy.com*")
|| shExpMatch(url,"*highwire.stanford.edu*")
|| shExpMatch(url,"*csa.com*")
|| shExpMatch(url,"*jcr.clarivate.com*")
|| shExpMatch(url,"*las.ac.cn*")
|| shExpMatch(url,"*blackwell-synergy.com*")
|| shExpMatch(url,"*oxfordjournals.org*")
) {
return "PROXY 192.168.1.210:6256";
}
return "DIRECT";
}
如果使用了PAC, 则浏览器在接受我们要求的网址后会去执行ret = FindProxyForURL(url, host). 其中,
url是所要求网址的完整路径,
host是对方的计算机名称(就是在://和/之中的部份).
return值ret是Proxy的组态. 它的格式有下列三种:
比如说当浏览器得到的是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()
这三个函数的功用都是检查线在时间是否在指定范围内,可以设定分时段使用代理服务