PAC(Proxy Auto Config)代理自动配置文件的编写

常光明
2023-12-01

Proxy Auto Config文件格式说明

PAC文件实际上是一个Script, 通过PAC我们可以让系统根据情况判断使用哪一个Proxy来访问目标网址, 这样做的好处:

  1. 分散Proxy的流量,避免Proxy Server负载过高
  2. 针对个别条件设定, 加快浏览速度
  3. 设定请求顺序, 自动依次尝试多个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的组态. 它的格式有下列三种:

  • 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()
这三个函数的功用都是检查线在时间是否在指定范围内,可以设定分时段使用代理服务

 类似资料: