一个PAC文件包含一个JavaScript形式的函数“FindProxyForURL(url, host)”。
它是一段JavaScript 脚本:
function FindProxyForURL(ur1,host)
{
return"DIRECT";
}
上面就是一个最简洁的PAC文件,意思是所有流量都直接进入互联网,不走代理。
PAC 语法和函数
上面函数中,url字段就是我们在浏览器地址栏输入的待访问地址,host为该地址对应的hostname,return 语句有三种指令:
DIRECT,表示无代理直接连接
PROXY host:port,表示走host:port的proxy 服务
SOCKS host:port,表示走host:port的socks服务
而返回的接口可以是多个代理串联:
return"PROXY 222.20.74.89:8800;SOCKS 222.20.74.89:8899;DIRECT";
上面代理的意思是,默认走222.20.74.89:8800的proxy服务;如果代理挂了或者超时,则走222.20.74.89:8899的socks代理;如果 socks也挂了,则无代理直接连接。
PAC提供了几个内置的函数,下面挨个介绍下:
类似于==,但是对大小写不敏感,
if(dnsDomainIs(host,"google.com")||
dnsDomainIs(host,"www.google.com"))
{
return"DIRECT";
}
正则匹配,*匹配用的比较多,可以是*http:/∥example.com,也是可以下面这样,
if(shExplMatch(host,"vpn.domain.com)l|
shExplMatch(ur1,"http://abcdomain.com/folder/*"))
{
return"DIRECT";
}
判断是否在网段内容,比如10.1.0.0这个网段,10.1.1.0就在网段中,
if(isInNet(dnsResolve(host),"172.16.0.0","255.240.0.0"))
{
return"DIRECT";
}
返回主机的IP
if(isInNet(myIpAddress(),"10.10.1.0","255.255.255.0))
{
return"PROXY 10.10.5.1:8080";
}
通过DNS查询主机ip
if(isInNet(dnsResolve(host),"10.0.0.0","255.0.0.0)||
isInNet(dnsResolve(host),"172.16.0.0","255.240.0.0)l|
isInNet(dnsResolve(host),"192.168.0.0","255.255.0.0)||
isInNet(dnsResolve(host),"127.0.0.0","255.255.255.0"))
{
return"DIRECT";
}
判断是否为诸如http://barret/,http://server-name/这样的主机名
if(isPlainHostName(host))
{
return"DIRECT";
}
判断主机是否可访问
if(isResolvable(host)){
return"PROXY proxyl.example.com:8080";
}
举例一个全自动代理VPN服务器
function FindProxyForURL(url, host) {
if (shExpMatch(host, '10.134.*.*')) //地址是需要访问的地址
{
return 'PROXY *.*.*.*:端口';
}
else if (shExpMatch(host, '172.16.*.*')) //地址是需要访问的地址
{
return 'PROXY *.*.*.*:端口';
}
else
{
return 'DIRECT';
}
}
先介绍一下设置各个系统代理的方法。
Windows
Internet选项--连接 选项卡--局域网设置(如果是电脑拨号上网, 这里点'设置')-- 使用自动配置脚本--填入PAC地址--确定
Mac OS X
系统设置 -- 网络 --高级 --代理 --自动代理配置 --URL中填入PAC地址 -- 好