今天和一个朋友聊到了chrome的自动代理功能,很多人感觉这个功能非常方便,但大家或许不知道这个功能其实是继承自IE浏览器,而且在“遥远”的Windows 98时代IE就已经具有了这个功能。这个功能在IE中被称作Proxy Automatic Configuration简称PAC,这个功能在1996年由Netscape公司开发,随着被IE支持后成为一个业内统一标准。
那么我们在什么情况下需要用到PAC呢?简单的说就是我们需要对一部分网站需要用到特定的代理服务,比如我们公司的内部办公系统就需要用到一个公司的内部 代理去访问,而这个代理又不能连接外网,这时候如果我们在访问这些网站时再手动设置代理就会非常麻烦。用PAC就会轻松得多。
如何配置PAC
PAC的配置方法非常简单,不需要安装任何软件或插件,只需用记事本建立一个脚步文件即可,我们可以把这个文件保存在硬盘的任何位置,也可以保存在服务器上,然后打开Internet选项 - 进入 连接 选项卡 - 点击 局域网选项 - 选中 使用自动配置脚本 选项 - 在地址里面填入你的文件位置,比如files://d:/*.pac ,即可完成配置。
PAC文件的内容
那么PAC文件中应该写些什么呢?其实这个文件只是一个在配置一个叫做FindProxyForURL(url, host)的JScript函数。比如这个文件的内容可以是:
function FindProxyForURL(url, host) { return "PROXY DIRECT; PROXY 192.168.0.1:8080; SOCKS 192.168.1.1:1080 "; } 这是一个最简单的PAC脚本,意思就是让对于所有网站都直接进行连接,如果不能连接就尝试使用http代理192.168.0.1进行连接,如果仍然无法连接就尝试SOCKS代理192.168.1.1。
通过上面的示例大家不难看出IE在调用这个函数的时候会传入两个变量来,一个是地址URL全路经,另一个是URL中的主机名部分。而函数在返回的时候可以是三种值,DIRECT代表直接连接,PROXY代表HTTP代理,SOCKS代表SOCKS类型代理。
典型应用
根据URL判断是否需要代理
function FindProxyForURL(url, host) {
if (shExpMatch(url,"*.facebook.com/*")) {
return "PROXY 127.0.0.1:8087";
}
return "DIRECT";
}
shExpMatch这个函数可能是写PAC脚本中最常用到的了,在本示例中的作用实现对于facebook 域名下的页面调用127.0.0.1:8087这个代理,而其他URL直接访问。
代理不能解析的主机
function FindProxyForURL(url, host)
{
if (isResolvable(host))
return "DIRECT";
else
return "PROXY 127.0.0.1:8087";
}
这个isResolvable函数实现的功能就是当某个主机域名不能被正常解析的时候就尝试代理访问,比如公司内部如果有独立的DNS而这台DNS又只解析内部地址,就可以利用这个函数*的切换内外网了,当然也可以用来对付某些ISP的域名劫持。
在家庭和公司之间自动切换
function FindProxyForURL(url, host)
{
if (myIpAddress() == "192.168.0.254") {
return “PROXY 127.0.0.1:80″;
}
else {
return “DIRECT”;
}
}
如果你习惯在下班后将笔记本带回家中的话myIpAddress函数将会十分有用,示例中实现的作用是当本机ip为192.168.0.254的时候就使用127.0.0.1:80这个代理,否则直接连接。
随机选择代理
function FindProxyForURL(url,host)
{
return randomProxy();
}
function randomProxy()
{
switch( Math.floor( Math.random() * 5 ) )
{
case 0:
return “PROXY proxy1:80″;
break;
case 1:
return “PROXY proxy2:80″;
break;
case 2:
return “PROXY proxy3:80″;
break;
case 3:
return “PROXY proxy4:80″;
break;
case 4:
return “PROXY proxy5:80″;
break;
}
}
这个示例中用了一个js中常见的随机数选择方法实现了在5个代理服务器中随机选择,这条函数的作者用意大概是平衡服务器使用量,但更重要是的是给我们打开了一个思路,让一些常见的js函数加入到PAC文件中或许能写出一些精彩有趣的函数来。
可用函数
以下列举的是可用于FindProxyForURL()函数体中的条件函数,这些函数的具体用法如果大家感兴趣请查阅互联网,这里就不详细介绍了:
基于主机名的函数:
isPlainHostName() dnsDomainIs() localHostOrDomainIs() isResolvable() isInNet()
相关的实用程序函数:
dnsResolve() myIpAddress() dnsDomainLevels()
基于URL/主机名的条件:
shExpMatch()
基于时间的条件:
weekdayRange() dateRange() timeRange() isPlainHostName(host)
附:可以用的ip
41.78.125.81:8080
79.101.37.131:8080
84.41.108.74:8080
94.153.243.178:8080
95.215.48.146:8080
96.47.230.49:8080
130.94.148.99:80
173.239.3.133:65501
178.48.2.237:80
180.211.134.66:8080
180.235.163.3:80
180.235.163.3:8081
180.235.163.12:80
180.235.163.12:8082
186.101.65.115:80
186.190.210.130:80
190.95.148.234:8080
198.100.159.69:8080
208.68.37.137:8080
216.52.223.214:80
31.41.8.68:8080
41.78.125.3:8080
49.0.174.52:80
50.115.164.34:8080
62.173.43.73:8080
68.71.76.242:8082
79.110.39.41:8080
103.15.238.250:8080