Proxy Auto Config

什么是 Proxy Auto Config

首先,我们一定要知道什么是 Proxy ?他的功用是什么?如果还不知道,可以参照 这份文件
PAC(Proxy Auto Config) 又是什么呢?它实际上是一个 Script ;经由编写这个 Script ,我们可以让系统判断在怎么样的情形下,要利用哪一台 Proxy 来进行联机。这样做主要的好处有:

1.      分散 Proxy 的流量,避免 Proxy Server 负载过高

2.      针对个别条件设定、加快浏览速度

3.      设定要求顺序,在某台 Proxy 无法联机时,可自动尝试别种联机方式

Proxy Auto Config File 的格式

基本上 Proxy Auto Config File (以下简称 PAC )是一个纯文字文件,他的语法采用 JavaScript ;所以建议要学习编写 PAC 的人,最好先学习基本的 JavaScript 。一个 PAC 档必需是单独的 JavaScript ,其中不能包含任何 HTML 标签。

PAC 档中,一定要定义 Function FindProxyForURL 如下:

function FindProxyForURL( url, host )

{

      ...

}

如果使用了 PAC 档,则浏览器在接受我们要求的网址后,会去执行

ret = FindProxyForURL( url, host );

这样的指令。其中, url 是所要求网址的完整路径, host 是对方的计算机名称(就是在 :// / 之中的部份);而 return ret 则是 Proxy 的组态,它的格式有下列三种:

·  DIRECT 直接联机而不透过 Proxy

·  PROXY host:port 使用指定的 Proxy 伺服机

·  SOCKS host:port 使用指定的 Socks 伺服机

比如说当浏览器得到的是 Proxy proxy.ncu.edu.tw:3128; Proxy proxy.csie.ncu.edu.tw:3128; DIRECT 的话,那浏览器会先尝试透过 proxy.ncu.edu.tw 来开启网页,如果无法使用,则尝试 proxy.csie.ncu.edu.tw ,还是不行的话,就直接联机。

PAC 中特别的 Function

PAC 中,除了可以使用一般 JavaScript Function 外,它还定义了一些特别的 Function 可以使用:

·  isInNet()

host 由网址取得的主机名称。

Function 会判断 host 是否为不包含网域 (Domain) 。如果是,则 return true ;如果包含,则 return false

范例:

1.      isPlainHostName("www") return true

2.      isPlainHostName("www.netscape.com") return false

host 由网址取得的主机名称。
domain
指定的网域。

Function 会判断 host 是否属于网域 domain 。如果是,则 return true ;否,则 return false

范例:

1.      dnsDomainIs("www.netscape.com", ".netscape.com") return true

2.      dnsDomainIs("www", ".netscape.com") return false

3.      dnsDomainIs("www.mcom.com", ".netscape.com") return false

host 由网址取得的主机名称。
hostdom
完整的网域名称。

Function 会判断 host 是否为 hostdom ,或 host 是否为 hostdom 的主机名称。如果是,则 return true ;否,则 return false

范例:

1.      localHostOrDomainIs("www.netscape.com", "www.netscape.com") return true (完全相同)

2.      localHostOrDomainIs("www", "www.netscape.com") return true (主机名称相同)

3.      localHostOrDomainIs("www.mcom.com", "www.netscape.com") return false (网域不同)

4.      localHostOrDomainIs("home.netscape.com", "www.netscape.com") return false (主机名称不同)

host 由网址取得的主机名称。

Function 会尝试透过 DNS 去解析 host ,如果解析成功,则 return true ;否则 return false

范例:

1.      isResolvable("www.netscape.com") return true (除非 DNS 无法正常运作)

2.      isResolvable("bogus.domain.foobar") return false (除非真的冒出这个 domain 出来

host 主机名称,可以是 Domain Name IP 。如果是 Domain Name ,则会透过 DNS 查出 IP
pattern IP

mask
对应于 pattern 的屏蔽。

Function host 是否在指定的 IP 范围内,如果是,则 return true ;否则 return false

范例:

1.      isInNet(host, "198.95.249.79", "255.255.255.255") host 198.95.249.79 时,会 return true

2.      isInNet(host, "140.115.0.0", "255.255.0.0") host 140.115.*.* 时,会 return true

host 要透过 DNS 解晰的主机名称。

Function 会透过 DNS 去解析 host return 值即为解析之结果。

范例:

1.      dnsResolve("www.math.ncu.edu.tw") return "140.115.25.9"

Function return 浏览器所在计算机之 IP 地址。

host 由网址取得的主机名称。

Function return host Domain 层数(点的数目)。

范例:

1.      dnsDomainLevels("www") return 0

2.      dnsDomainLevels("www.netscape.com") return 2

str 要进行比对的字符串。
shexp
比对的条件。

Function 会比对 str 是否符合 shexp 的表示式(此表示式为 shell expression 而非 regular expressions )。如果是,则 return true ;否则 return false

范例:

1.      shExpMatch("http://home.netscape.com/people/ari/index.html", "*/ari/*") return true

2.      shExpMatch("http://home.netscape.com/people/montulli/index.html", "*/ari/*") return false

weekdayRange() dateRange() timeRange()

这三个 Function 的功用都是检查线在时间是否在指定范围内,用这些 Function 就可以设定分时段使用 Proxy Server 但由于较为繁琐,如有兴趣或需要,请参考 原始文件