port>
如果是选用由分号分割的多块设置,按照从左向右,最左边的代理会被最优先调用,除非浏览器无法成功和proxy建立连接,那么下一个配置就会被调用.如果浏览器遇到不可用的代理服务器,浏览器将在30分钟后自动重试先前无响应的代理服务器,一个小时后会再次进行尝试,依此类推,每次间隔时间为30分钟.这意味着,如果暂时关闭代理服务器,客户机至多在其重新启动后30分钟便会重新开始使用该代理服务器.如果所有代理服务器均停用且未指定DIRECT返回值,浏览器将询问用户是否暂时忽略代理服务器而尝试直接进行连接.Navigator将询问是否应在20分钟后重试代理服务器,接着过20分钟会再次询问,依此类推,每次间隔时间为20分钟.举例
PROXYproxy.example:
8080;PROXYproxy.example:
8081;DIRECT
下面是可用于FindProxyForURL<>函数体中的条件函数:
基于主机名的函数:
isPlainHostName<>
dnsDomainIs<>
localHostOrDomainIs<>
isResolvable<>
isInNet<>
相关的实用程序函数:
dnsResolve<>
myIpAddress<>
dnsDomainLevels<>
基于URL/主机名的条件:
shExpMatch<>
基于时间的条件:
weekdayRange<>
dateRange<>
timeRange<>
isPlainHostName
host即上文所述不包含端口号的,url中的主机名,下同,不再赘述.如果主机名中不包含域名则返回true.参考如下:
isPlainHostName<"www">返回true.
isPlainHostName<"google">返回false.
dnsDomainIs
domain用于和hostname进行比较的域名.如果hostname的域名和domain的值相匹配则返回true.参考如下:
dnsDomainIs<"google",".google">返回true.
dnsDomainIs<"www",".google">返回false.
dnsDomainIs<"apple",".google">返回false.
localHostOrDomainIs
hostdom是要进行匹配的指定的主机名.如果hostname和指定的hostdom相匹配,或者在hostname中没有指定要进行匹配的域名部分,函数返回true.参考如下:
localHostOrDomainIs<"google","google">返回true.
localHostOrDomainIs<"www","google">返回true.
localHostOrDomainIs<"apple","google">返回false.
localHostOrDomainIs<"adc.apple","google">返回false.
isResolvable
如果成功解析主机名则返回true.参考如下:
isResolvable<"google">返回true<除非由于防火墙或某些其他原因导致DNS无法解析>.
isResolvable<"bogus.domain.foobar">返回false.
isInNet
host在这里可以是DNS主机名,比如google,也可以是IP地址.如果传递的是主机名,此函数会将其解析成IP地址.pattern是点分隔格式的IP地址模式.
mask是IP地址模式掩码,用于确定应对IP地址的哪些部分进行匹配.值为0表示忽略;255表示匹配.如果主机的IP地址与指定的IP地址模式匹配,则返回true.参考如下:
isInNet如果host的IP地址为198.95.249.79则返回true.
isInNet如果host的IP地址为198.95.*.*则返回true.
dnsResolve
host是要解析的主机名.将给定DNS主机名解析成IP地址,并以点分隔格式的字符串形式将其返回.参考如下:
dnsResolve<"google">返回IP地址"64.233.189.104".
myIpAddress<>
此函数将以点分隔格式的字符串形式返回运行浏览器的那台计算机的IP地址.
dnsDomainLevels
返回url主机名中的DNS层数<圆点数>.参考如下:
dnsDomainLevels<"www">返回0
dnsDomainLevels<"google">返回2
shExpMatch
str是要比较的任何字符串<例如,url或主机名>.
shexp是用以进行比较的shell表达式.如果字符串与指定的shell表达式匹配,则此表达式为true.参考如下:
shExpMatch<":
//apple/downloads/macosx/index.html","*/macosx/*">返回true.
shExpMatch<":
//apple/downloads/support/index.html","*/macosx/*">返回false.
weekdayRange
wd1和wd2为以下任意一个星期日期字符串:
SUNMONTUEWEDTHUFRISAT,gmt或者是字串GMT或者省略,前者表示格林威治标准时间,后者表示当地时间.只有第一个参数wd1是强制性的.wd2、gmt中的任一个或两者皆可省略.如果只有一个参数,则此函数将在该参数所表示的星期日期返回true.如果指定字符串GMT作为第二个参数,则采用GMT时间,否则采用当地时区的时间.如果wd1和wd2均被定义,则该条件在当前星期日期介于这两个星期日期之间时为true.首末日期包括在内.参数顺序很重要;"MON,""WED"指星期一到星期三,而"WED,""MON"是从星期三到下周的星期一.
weekdayRange<"MON","FRI">从星期一到星期五<当地时区>为true.
weekdayRange<"MON","FRI","GMT">从格林威治标准时间星期一到星期五为true.
weekdayRange<"SAT">当地时间星期六为true.
weekdayRange<"SAT","GMT">格林威治标准时间星期六为true.
weekdayRange<"FRI","MON">从星期五到下星期一为true<注意,顺序很重要>.
dateRange
dateRange
dateRange
dateRange
dateRange
dateRange
dateRange
dateRange
dateRange
dateRange
day每月1到31号中的任意一天<整数类型>.
month是如下表示月份的字符串中的一个:
JANFEBMARAPRMAYJUNJULAUGSEPOCTNOVDEC,year是表示年份的完整数字,例如1995<而不是95>.整数类型.
gmt或者为字符串GMT,或者保留为空,前者将以格林威治标准时间进行时间比较,后者假定时间处于当地时区.尽管上面表示的函数语法不是每一个都包含gmt参数,事实上可以在上述9个任一调用配置文件中指定gmt参数,不过,它始终都要作为最后一个参数.如果只指定了单个值<对于每个类别:
day、month、year>,则此函数仅在与指定值匹配的日子才会返回true.如果指定了两个值,则从指定的第一个时间到指定的第二个时间,结果均为truee.首末日期包括在内.参考如下:
dateRange<1>在当地时区每月的第一天为true.
dateRange<1,"GMT">在GMT时间每月的第一天为true.
dateRange<1,15>在当地时区每月的1号到15号为true.
dateRange<24,"DEC">在当地时区每年12月24号为true.
dateRange<24,"DEC",1995>在当地时区1995年12月24号为true.
dateRange<"JAN","MAR">在当地时区每年第一季度<1月到3月>为true.
dateRange<1,"JUN",15,"AUG">在当地时区每年6月1号到8月15号为true,首末日期包括在内.
dateRange<1,"JUN",15,1995,"AUG",1995>在当地时区1995年6月1号到8月15号为true,首末日期包括在内.
dateRange<"OCT",1995,"MAR",1996>在当地时区1995年10月到1996年3月为true.
dateRange<1995>在当地时区1995年为true.
dateRange<1995,1997>在当地时区1995年1月1号到1997年12月31号<1995年初到1997年底>为true.
timeRange
timeRange
timeRange
timeRange
timeRange
hour是0点<午夜12点>到23点<晚上11点>表示小时的数值中的一个.
min是表示分钟的0到59中的一个值.
sec是表示秒钟的0到59中的一个值.
gmt同上文所述.
timerange<12>中午12点到下午1点之间为true.
timerange<12,13>同上例.
timerange<12,"GMT">在GMT时间中午12点到下午1点之间为true.
timerange<9,17>上午9点到下午5点之间为true.
timerange<8,30,17,00>上午8点30分到下午5点之间为true.
timerange<0,0,0,0,0,30>午夜0点到其后的30秒内为true.
用本本上网时,往返家里和单位,因为单位是用的代理上网,家里是直接连接.因此每次都要修改IE的代理设置,虽然是个小事,但是每次都要修改总是有点烦,于是参考GOOGLE,写了一个自动配置代理的脚本.这样无论在家和在公司,只要连上局域网就可以上网了.
functionFindProxyForURL{
if<>||shExpMatch>{
return"direct";
}else{ if=="192.168.0.49"> return"PROXY192.168.0.6:
808";
else return"direct";
}
}
把以上代码另存为proxy.pac的文件,如:
c:
\proxy.pac,然后在IE的菜单里"工具"->"INTEL选项"->"连接"->局域网设置
把使用自动配置脚本选上,然后在地址栏填入file:
//c:
/proxy.pac,注意file后是两斜杠,要使设置生效,需要关闭IE再重新打开.
现在我们介绍下这个proxy.pac脚本文件,脚本的语法是js语法,js的内置函数可以使用,要实现自动配置代理,需要实现FindProxyForURL这个函数,其参数url代表要访问的连接,host代表要访问连接的主机名,该函数有三个返回参数
direct:
直接连接
proxyIP:
PORT
socketIP:
PORT返回结果大小写不敏感
PAC的其他内置语法见
PAC脚本另外一个重要的应用是多台代理服务器并存的情况下,通过pac脚本的控制:
用户随机选择使用多台代理服务器中的任意一台来达到流量负载均衡的目的;管理员通过PAC脚本控制用户使用和不使用某台代理服务器,这样可以空出时间对代理服务器进行维护;让服务器工作在主备模式,当主服务器宕机时,会自动切换到其它备用服务器而不会中断服务;根据访问目的地的不同,自动选择最佳代理服务器.
下面列举几个PAC的实例,顺便学习下它的语法
a、isPlainHostName,本例演示判断是否为本地主机,如:
//myservername/的方式访问,如果是直接连接,否则使用代理
functionFindProxyForURL
{
if>
return"DIRECT";
else
return"PROXYproxy:
80";
}
b、dnsDomainIs、localHostOrDomainIs,本例演示判断访问主机是否属于某个域和某个域名,如果属于pany域的主机名,而域名不是和的直接连接,否则使用代理访问.
functionFindProxyForURL
{
if<||
dnsDomainIs>&&
!
localHostOrDomainIs&&
!
localHostOrDomainIs>
return"DIRECT";
else
return"PROXYproxy:
80";
}
c、isResolvable,本例演示主机名能否被dns服务器解析,如果能直接访问,否则就通过代理访问.
functionFindProxyForURL
{
if>
return"DIRECT";
else
return"PROXYproxy:
80";
}
d、isInNet,本例演示访问IP是否在某个子网内,如果是就直接访问,否则就通过代理,例子演示访问清华IP段的主页不用代理.
functionFindProxyForURL
{
if>
return"DIRECT";
else
return"PROXYproxy:
80";
}
e、shExpMatch,本例演示根据主机域名来改变连接类型,本地主机、*.edu、
*分别用不同的连接方式.
functionFindProxyForURL
{
if> return"DIRECT";
elseif>
return"PROXYcomproxy:
80";
elseif>
return"PROXYeduproxy:
80";
else
return"PROXYproxy:
80";
}
f、url.substring<>,本例演示根据不同的协议来选择不同的代理,、s、ftp、
gopher分别使用不同的代理.
functionFindProxyForURL
{
if==":
">{
return"PROXYproxy:
80";
}
elseif=="f