[转]玩转IE之自动切换代理服务器

今天和一个朋友聊到了chrome的自动代理功能,很多人感觉这个功能非常方便,但大家或许不知道这个功能其实是继承自IE浏览器,而且在“遥远”的Windows 98时代IE就已经具有了这个功能。这个功能在IE中被称作Proxy Automatic Configuration简称PAC,这个功能在1996年由Netscape公司开发,随着被IE支持后成为一个业内统一标准。

那么我们在什么情况下需要用到PAC呢?简单的说就是我们需要对一部分网站需要用到特定的代理服务,比如我们公司的内部办公系统就需要用到一个公司的内部代理去访问,而这个代理又不能连接外网,这时候如果我们在访问这些网站时再手动设置代理就会非常麻烦。用PAC就会轻松得多。

如何配置PAC

PAC的配置方法非常简单,不需要安装任何软件或插件,只需用记事本建立一个脚步文件即可,我们可以把这个文件保存在硬盘的任何位置,也可以保存在服务器上,然后打开Internet选项 - 进入 连接 选项卡 - 点击 局域网选项 - 选中 使用自动配置脚本 选项 -  在地址里面填入你的文件位置,比如files://d:/goagent.pac ,即可完成配置。

image

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)

PAC辅助函数功能:
dnsDomainIs(host, domain):

如果主机是指定域的一部分,否则返回false,则返回true。
isInNet(hostname, Resolves the hostname and subnet IP, subnet mask) :

sInNet(主机名,解决了主机和子网的IP地址,子网掩码)返回true,如果是子网内的主机名
指定IP地址和子网掩码,否则返回false。
isPlainHostName(host):

isPlainHostName(主机)返回true,如果没有点中的主机名,否则返回false。
isResolvable(host):

isResolvable(主机)Internet Explorer尝试解析主机名的DNS,如果成功,则返回true,否则返回false。
localHostOrDomainIs:

localHostOrDomainIs返回true,如果主机匹配的主机部分(主机,域)的域,或者如果主机匹配的主机和域的域部分,否则为false。 仅在本地域中的URL)。
dnsDomainLevels(host):

返回点的数量的主机名。
dnsResolve(host):

dnsResolve(主机)返回一个字符串,其中包含指定的主机的IP地址。
myIPAddress( ):

myIPAddress()返回一个字符串,其中包含了本地计算机的IP地址。
shExpMatch(url, shexp):

所提供的URL,如果符合指定的shell表达,shExpMatch(URL,shexp)返回true,否则返回false。
dateRange(parmList):

如果当前日期在指定日期parmList,则返回true,否则返回false。
timeRange(parmList):

如果当前时间在parmList指定的时间范围内,返回true,否则返回false。
weekdayRange(parmList):

如果今天是在日的一周中指定的parmList,则返回true,,否则返回false。

转自:http://blog.sina.com.cn/s/blog_3dbdb89701013xy5.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值