首先,这博文要是在知道什么是代理或如何使用代理的基础上的。如果不清楚,请查看下代理的有关方面的知识。
在这里主要是讲代理动态配置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.a.com:3128; Proxy proxy.b.com:3128; DIRECT的话,那浏览器会先尝试透过 proxy.a.com 来开启网页,如果无法使用,则尝试proxy.b.com,还是不行的话,就直接联机。
######################################### 函数介绍 #################################
PAC 中特别的 Function
在 PAC 中,除了可以使用一般 JavaScript 的 Function 外,它还定义了一些特别的 Function 可以使用:
·isPlainHostName()
·dnsDomainIs()
·localHostOrDomainIs()
·isResolvable()
·isInNet()
·dnsResolve()
·myIpAddress()
·dnsDomainLevels()
·shExpMatch()
·weekdayRange()
·dateRange()
·timeRange()
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
localHostOrDomainIs( host, hostdom )
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 出来…)
isInNet( host, pattern, mask )
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。但由于较为繁琐,如有兴趣或需要,请参考原始文件
################################ 事例proxy.pac ###############################
function FindProxyURL(url,host){
if(
dnsDomainIs(host,"www.qq.com") ||
dnsDomainIs(host,"www.weibo.com")
){
return "PROXY proxy.a.com:80" ;
}
return "DIRECT";
}
解释:如果访问的主机名是"www.qq.com"或者"www.weibo.com"的就使用代理服务器(proxy.a.com:80)进行访问,其他的则可以直接访问。
至此,自动代理的配置文件基本上可以写完了。剩下的就是使用部分了.
在浏览器中都会有使用代理功能,如Chrome下图:
可以看到有“更改代理服器设置”的按钮,点击就会弹出右边的“Internet 连接”的属性选项卡,其中的“连接部分”。
因为在这里的局域网使用的本地连接上网,所以我使用的是“局域网网设置”,就会弹出其设置的对话框,如下图:
按上面的配置,在“地址”处填写代理的配置文件的url路径,本地和网络的都可以,只要能访部到就可以了。
至此,已经大功告成了.
来源:oschina
链接:https://my.oschina.net/u/4318872/blog/4317560