因为有朋友在深圳大学,他们学校的网络比较变态。如果访问了教育网指定的免费IP之外的IP,每M6元钱。
我本来想教她用二级代理之类的,不过无奈这个对她来讲太难了。所以权宜之下,我只好让她使用IE的自动配置脚本文件来限制以防万一,至少能保证她在使用浏览器上网的时候不会因为不小心访问了收费的IP而挨宰。
虽然说这么变态的学校不多,但是终究还是有的,所以把自动配置脚本文件的写法写出来,如果有需要的朋友可以参考着来。
首先我们先来介绍一下自动配置脚本文件:
打开IE,点击"工具"--"Internet选项"--"局域网设置",你就可以看到"使用自动配置脚本"
自动配置脚本起的作用就是,当IE访问网页的时候会根据脚本文件里面界定的内容来访问。比方说,你在脚本文件里面限定了访问某些IP使用某个代理的时候,访问另外一些IP使用另外的代理,这就很方便通过脚本文件来完成。
一个PAC文件其实就是一个文本文件,最简单的格式就是包含一个叫FindProxyForURL的JScript函数,IE通过传入两个变量来调用这个函数,一个是用户浏览的地址URL全路经,一个是这个URL中的主机名部分(host)。
这个FindProxyForURL函数有三种可能的字符串返回值,一是"DIRECT",就是直接连接,不通过代理;二是"PROXYproxyaddr:port",其中proxyaddr和port分别是代理的地址和代理的端口;三是"SOCKSsocksaddr:port",其中socksaddr和port分别是socks代理的地址和端口,一个自动代理文件可以是多个选择的组合,其中用分号(;)隔开,如:
functionFindProxyForURL(url,host)
{
if(host=="www.mydomain.com")
return"DIRECT";
return"PROXYmyproxy:80;
PROXYmyotherproxy:8080;
DIRECT";
}
下面是代理脚本可能用到的函数和说明(英文不好的朋友可以直接跳过去看应用):
PACHelperFunctions
dnsDomainIs(host,domain)Returnstrueifthehostispartofthespecifieddomain,falseotherwise.
isInNet(hostname,ResolvesthehostnameandsubnetIP,subnetmask)returnstrueifthehostnameiswithinthesubnet
specifiedbytheIPaddressandthesubnetmask,falseotherwise.
isPlainHostName(host)Returnstrueiftherearenodotsinthehostname,falseotherwise.
isResolvable(host)InternetExplorertriestoresolvethehostnamethroughDNSandreturnstrueifsuccessful,falseotherwise.
localHostOrDomainIsReturnstrueifthehostmatches(host,domain)thehostportionofthedomain,orifthehostmatchesthehostanddomainportionsofthedomain,falseotherwise.(ExecutedonlyforURLsinthelocaldomain.)
dnsDomainLevels(host)Returnsthenumberofdotsinthehostname.
dnsResolve(host)ReturnsastringcontainingtheIPaddressofthespecifiedhost.
myIPAddress()Returnsastringcontainingthelocalmachine'sIPaddress.
shExpMatch(url,shexp)ReturnstrueifthesuppliedURLmatchesthespecifiedshellexpression,falseotherwise.
dateRange(parmList)ReturnstrueifthecurrentdatefallswithinthedatesspecifiedinparmList,falseotherwise.
timeRange(parmList)ReturnstrueifthecurrenttimefallswithinthetimesspecifiedinparmList,falseotherwise.
weekdayRange(parmList)ReturnstrueiftodayiswithinthedaysoftheweekspecifiedinparmList,falseotherwise.
下面是各个函数应用的例子:
作者:xmudahai2006-10-1700:33回复此发言
--------------------------------------------------------------------------------
2自动配置脚本文件的写法与用途(原创)
a、isPlainHostName(host),本例演示判断是否为本地主机,如http://myservername/
的方式访问,如果是直接连接,否则使用代理
functionFindProxyForURL(url,host)
{
if(isPlainHostName(host))
return"DIRECT";
else
return"PROXYproxy:80";
}
b、dnsDomainIs(host,"")、localHostOrDomainIs(host,""),本例演示判断访问主机是否属于某个域和某个域名,如果属于.company.com域的主机名,而域名不是company.com和home.company.com的直接连接,否则使用代理访问。
functionFindProxyForURL(url,host)
{
if((isPlainHostName(host)││
dnsDomainIs(host,".company.com"))&&
!localHostOrDomainIs(host,"www.company.com")&&
!localHostOrDomainIs(host,"home.company.com"))
return"DIRECT";
else
return"PROXYproxy:80";
}
c、isResolvable(host),本例演示主机名能否被dns服务器解析,如果能直接访问,否则就通过代理访问。
functionFindProxyForURL(url,host)
{
if(isResolvable(host))
return"DIRECT";
else
return"PROXYproxy:80";
}
d、isInNet(host,"",""),本例演示访问IP是否在某个子网内,如果是就直接访问,否则就通过代理,例子演示访问清华IP段的主页不用代理。
functionFindProxyForURL(url,host)
{
if(isInNet(host,"166.111.0.0","255.255.0.0"))
return"DIRECT";
else
return"PROXYproxy:80";
}
e、shExpMatch(host,""),本例演示根据主机域名来改变连接类型,本地主机、*.edu、*.com分别用不同的连接方式。
functionFindProxyForURL(url,host)
{
if(isPlainHostName(host))
return"DIRECT";
elseif(shExpMatch(host,"*.com"))
return"PROXYcomproxy:80";
elseif(shExpMatch(host,"*.edu"))
return"PROXYeduproxy:80";
else
return"PROXYproxy:80";
}
f、url.substring(),本例演示根据不同的协议来选择不同的代理,http、https、ftp、gopher分别使用不同的代理。
functionFindProxyForURL(url,host)
{
if(url.substring(0,5)=="http:"){
return"PROXYproxy:80";
}
elseif(url.substring(0,4)=="ftp:"){
return"PROXYfproxy:80";
}
elseif(url.substring(0,7)=="gopher:"){
return"PROXYgproxy";
}
elseif(url.substring(0,6)=="https:"){
return"PROXYsecproxy:8080";
}
else{
return"DIRECT";
}
}
g、dnsResolve(host),本例演示判断访问主机是否某个IP,如果是就使用代理,否则直接连接。
unctionFindProxyForURL(url,host)
{
if(dnsResolve(host)=="166.111.8.237"){
return"PROXYsecproxy:8080";
}
else{
return"PROXYproxy:80";
}
}
h、myIpAddress(),本例演示判断本地IP是否某个IP,如果是就使用代理,否则直接使用连接。
functionFindProxyForURL(url,host)
{
if(myIpAddress()=="166.111.8.238"){
return"PROXYproxy:80";
}
else{
return"DIRECT";
}
}
i、dnsDomainLevels(host),本例演示访问主机的域名级数是几级,就是域名有几个点如果域名中有点,就通过代理访问,否则直接连接。
functionFindProxyForURL(url,host)
{
if(dnsDomainLevels(host)>0){//ifnumberofdotsinhost>0
return"PROXYproxy:80";
}
return"DIRECT";
}
j、weekdayRange(),本例演示当前日期的范围来改变使用代理,如果是GMT时间周三到周六,使用代理连接,否则直接连接。
functionFindProxyForURL(url,host)
{
if(weekdayRange("WED","SAT","GMT"))
return"PROXYproxy:80";
else
return"DIRECT";
}
k、最后一个例子是演示随机使用代理,这样可以好好利用代理服务器。
functionFindProxyForURL(url,host)
{
returnrandomProxy();
}
functionrandomProxy()
{
switch(Math.floor(Math.random()*5))
{
case0:
return"PROXYproxy1:80";
break;
case1:
return"PROXYproxy2:80";
break;
case2:
return"PROXYproxy3:80";
break;
case3:
return"PROXYproxy4:80";
break;
case4:
return"PROXYproxy5:80";
break;
}
}
利用上面的函数和例子说明,大家就可以写出比较复杂有效的自动代理脚本。