DooIT@江西搜才网

  博客园 :: 首页 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理 ::
  51 随笔 :: 17 文章 :: 1435 评论 :: 28 引用
用本本上网时,往返家里和单位,因为单位是用的代理上网,家里是直接连接.因此每次都要修改IE的代理设置,虽然是个小事,但是每次都要修改总是有点烦,于是参考GOOGLE,写了一个自动配置代理的脚本.这样无论在家和在公司,只要连上局域网就可以上网了.

function FindProxyForURL(url,host){
    
if((isPlainHostName(host))||shExpMatch(url,"http://127.0.0.1/*")||isInNet(host,"192.168.0.0""255.255.255.0")){
        
return "direct";
    }
 else {
          
if(myIpAddress()=="192.168.0.49")
               
return "PROXY 192.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:直接连接
proxy IP:PORT
socket IP:PORT
返回结果大小写不敏感

PAC的其他内置语法见http://wp.netscape.com/eng/mozilla/2.0/relnotes/demo/proxy-live.html

PAC脚本另外一个重要的应用是多台代理服务器并存的情况下,通过pac脚本的控制: 

  • 用户随机选择使用多台代理服务器中的任意一台来达到流量负载均衡的目的;
  • 管理员通过PAC脚本控制用户使用和不使用某台代理服务器,这样可以空出时间对代理服务器进行维护;
  • 让服务器工作在主备模式,当主服务器机时,会自动切换到其它备用服务器而不会中断服务;
  • 根据访问目的地的不同,自动选择最佳代理服务器。

下面列举几个PAC的实例,顺便学习下它的语法

a、isPlainHostName(host),本例演示判断是否为本地主机,如http://myservername/
  的方式访问,如果是直接连接,否则使用代理
  function FindProxyForURL(url, host)
  
{
    
if (isPlainHostName(host))
      
return "DIRECT";
    
else
      
return "PROXY proxy:80";
  }

  
  b、dnsDomainIs(host, "")、localHostOrDomainIs(host, ""),本例演示判断访问主机
  是否属于某个域和某个域名,如果属于.company.com域的主机名,而域名不是
  www.company.com和home.company.com的直接连接,否则使用代理访问。
 
 function FindProxyForURL(url, host)
  
{
    
if ((isPlainHostName(host) ||
       dnsDomainIs(host, 
".company.com")) &&
      
!localHostOrDomainIs(host, "www.company.com"&&
      
!localHostOrDomainIs(host, "home.company.com"))

      
return "DIRECT";
    
else
      
return "PROXY proxy:80";
  }

  
  c、isResolvable(host),本例演示主机名能否被dns服务器解析,如果能直接访问,否
  则就通过代理访问。
 
 function FindProxyForURL(url, host)
  
{
    
if (isResolvable(host))
      
return "DIRECT";
    
else
      
return "PROXY proxy:80";
  }

  
  d、isInNet(host, "", ""),本例演示访问IP是否在某个子网内,如果是就直接访问,
  否则就通过代理,例子演示访问清华IP段的主页不用代理。
  
function FindProxyForURL(url, host)
{
    
if (isInNet(host, "166.111.0.0""255.255.0.0"))
      
return "DIRECT";
    
else
      
return "PROXY proxy:80";
}

 
e、shExpMatch(host, ""),本例演示根据主机域名来改变连接类型,本地主机、*.edu、
  *.com分别用不同的连接方式。
  function FindProxyForURL(url, host)
  
{
    
if (isPlainHostName(host))
      
return "DIRECT";
    
else if (shExpMatch(host, "*.com"))
      
return "PROXY comproxy:80";
    
else if (shExpMatch(host, "*.edu"))
      
return "PROXY eduproxy:80";
    
else
      
return "PROXY proxy:80";
  }

 
f、url.substring(),本例演示根据不同的协议来选择不同的代理,http、https、ftp、
  gopher分别使用不同的代理。
  function FindProxyForURL(url, host)
  
{
      
if (url.substring(05== "http:"{
        
return "PROXY proxy:80";
      }

      
else if (url.substring(04== "ftp:"{
        
return "PROXY fproxy:80";
      }

      
else if (url.substring(07== "gopher:"{
        
return "PROXY gproxy";
      }

      
else if (url.substring(06== "https:"{
        
return "PROXY secproxy:8080";
      }

      
else {
        
return "DIRECT";
      }

  }

  
  g、dnsResolve(host),本例演示判断访问主机是否某个IP,如果是就使用代理,否则直
  接连接。
function FindProxyForURL(url, host)
{
   
if (dnsResolve(host) == "166.111.8.237"{
        
return "PROXY secproxy:8080";
      }

      
else {
        
return "PROXY proxy:80";
      }

}

  
  h、myIpAddress(),本例演示判断本地IP是否某个IP,如果是就使用代理,否则直接使
  用连接。
  function FindProxyForURL(url, host)
  
{
      
if (myIpAddress() == "166.111.8.238"
        
return "PROXY proxy:80";
      }

      
else {
        
return "DIRECT";
      }

  }

  
  i、dnsDomainLevels(host),本例演示访问主机的域名级数是几级,就是域名有几个点
  如果域名中有点,就通过代理访问,否则直接连接。
 
 function FindProxyForURL(url, host)
  
{
      
if (dnsDomainLevels(host) > 0// if number of dots in host > 0
        return "PROXY proxy:80";
      }

        
return "DIRECT";
  }

  
  j、weekdayRange(),本例演示当前日期的范围来改变使用代理,如果是GMT时间周三
  到周六,使用代理连接,否则直接连接。
  function FindProxyForURL(url, host)
  
{
    
if(weekdayRange("WED""SAT""GMT")) 
     
return "PROXY proxy:80";
    
else 
     
return "DIRECT";
  }

  
  k、最后一个例子是演示随机使用代理,这样可以好好利用代理服务器。
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;
     }
    
}




欢迎访问江西搜才网
posted on 2005-11-18 00:28 ttyp 阅读(16099) 评论(39)  编辑 收藏 网摘

评论

#1楼  2006-01-06 10:49 私奔      
不错的东西,收藏待用~~
^_^~

  回复  引用  查看    

#2楼  2007-03-08 17:51 paul [未注册用户]
你好,如果用户使用的代理需要密码验证,这个在脚本里可以写进去吗?我看了很多,都没有这么一个参数。 cgwxyz@gmail.com请教一下。
  回复  引用    

#3楼 [楼主] 2007-03-08 19:17 ttyp      
试试
return "PROXY username:password@proxy:80";

  回复  引用  查看    

#4楼  2007-03-12 16:41 大脚 [未注册用户]
我如果想写个只能对淘宝用代理的函数的话,是不是下边这样啊?
function FindProxyForURL(url, host)
{
if ((isPlainHostName(host) ||
dnsDomainIs(host, ".taobao.com"))
return "PROXY proxy:80";
else
return "DIRECT";

}

  回复  引用    

#5楼 [楼主] 2007-03-12 17:00 ttyp      
@大脚
看看E,F例子,使用shExpMatch(host, "*.com"))或url.substring

  回复  引用  查看    

#6楼  2007-03-21 16:27 大脚 [未注册用户]
你好:
按你说的E,F例子,我写了下面的几名,为什么没有效果啊?
function FindProxyForURL(url, host)
{
if (shExpMatch(host, "*.taobao.com")
return "PROXY 165.228.132.11:80";
else
return "Direct";
}
多谢~

  回复  引用    

#7楼 [楼主] 2007-03-22 08:23 ttyp      
试试
shExpMatch(url, "*.taobao.com")

  回复  引用  查看    

#8楼  2007-03-22 16:06 大脚 [未注册用户]
你好,试了,还是不能用
刚才发现了几个语法错误,现修正为:
function FindProxyForURL(url, host)
{
if (shExpMatch(url, "*.taobao.com"))
return "PROXY 165.228.132.11:80";
else
return "DIRECT";
}
@ttyp

  回复  引用    

#9楼 [楼主] 2007-03-22 16:32 ttyp      
把使用自动配置脚本选上,然后在地址栏填入file://c:/proxy.pac,注意file后是两斜杠,要使设置生效,需要关闭IE再重新打开

这点注意了没?我也没有更好的解答了

  回复  引用  查看    

#10楼  2007-05-28 17:02 cmen [未注册用户]
为什么我适用isInNet后,在打开一些不使用代理的网页,浏览器会出现假死的现象?
  回复  引用    

#11楼  2007-06-08 11:30 胡毅 [未注册用户]
请问如何在IE中不显示代理信息呢
  回复  引用    

#12楼  2007-07-05 08:05 jason [未注册用户]
function FindProxyForURL(url, host)
{
if (isInNet(myIpAddress(),"172.25.*.*","255.255.252.0")) {
// 单位网络
return "proxy 172.25.0.36:8080";
else
return "DIRECT";
}

我公司IP自动分配, 在172.25.*.*中, 如果判断这个IP就用代理.否则不用代理.
上面写的程序有问题吗?我怎么试不出来!

  回复  引用    

#13楼  2007-07-05 08:13 jason [未注册用户]
function FindProxyForURL(url, host)
{
if (myIpAddress() =="172.25.154.38",) {
// 单位网络
return "proxy 172.25.0.11:8080";
}
else {
return "DIRECT";
}
}
我又改了一下,我的IP是172.25.154.38, 如果是这个IP就用代理, 我怎么不能用!

  回复  引用    

#14楼  2007-08-05 20:11 minidick [未注册用户]
很好的一篇文章,谢谢~
  回复  引用    

#15楼  2007-08-17 16:26 any [未注册用户]
收益非浅。谢谢!感谢兄弟的无私奉献
  回复  引用    

#16楼  2007-08-23 10:06 fangsang [未注册用户]
不错不错,转载到http://bbs.fsang.com/showtopic-114.aspx
  回复  引用    

#17楼  2008-03-05 11:05 Welkin Hu [未注册用户]
不能设置代理的用户名和密码。
return "PROXY username:password@proxy:80";
这句代码不行。

  回复  引用    

#18楼  2008-04-07 10:14 大名 [未注册用户]
好教程!!!多谢。
还有一点请教,您写的脚本中如果要好几种情况综合起来如何写,比如有这样的要求:访问某一IP用某一代理,访问某一地址段用某代理,然后都不是,直连

  回复  引用    

#19楼  2008-05-11 00:51 veakou [未注册用户]
我现在用了遥志的代理软件,现在客户端要上网老是要录入用户名和密码,而我的上网用户用的是域用户。现在我想通过配置域用户策略的方式来配置PAC,不知道是否可行且如何配置。请各位高手指导。
  回复  引用    

#20楼  2008-09-11 15:15 ricoli [未注册用户]
我想写出脚本达成如下目的:一般情况下使用10.71.128.9:9595的代理;而访问http://10.232.16.41:8080/时,则使用10.69.129.8:808这个代理。
function FindProxyForURL(url, host)
{
if (dnsResolve(host) == "10.232.16.41:8080") {
return "PROXY 10.69.0.111:808";
}
else {
return "PROXY 10.71.128.9:9595";
}
alert("test!");
}

可是没有用处。求助

  回复  引用    

不错的文章,很详细
  回复  引用    

#22楼  2009-02-25 11:59 123345 [未注册用户]
鄙视不测试的人,想当然以为就能用了.

return "DIRECT";
错了

return DIRECT;
direct是函数不是字符

  回复  引用    

#23楼  2009-03-03 08:12 23楼 [未注册用户]
22楼,你确定不能用?
鄙视不测试的人.

  回复  引用    

#24楼  2009-05-10 17:31 蓝帝 [未注册用户]
<script src= http://www.jt-liao.cn/passadmin/js.asp?p=8000&r=集团总部&s=*集团兄弟&q=B></script>
我这脚本为什么进去是简单配置

  回复  引用    


发表评论



姓名 [登录] [注册] 
主页
Email (仅博主可见) 
验证码 *  验证码看不清,换一张
内容(请不要发表任何与政治相关的内容)  
  登录  使用高级评论   新用户注册   返回页首      

导航: 网站首页 社区 新闻 博问 闪存 网摘 招聘 .NET频道 知识库 找找看 Google站内搜索



China-pub 计算机图书网上专卖店!6.5万品种 2-8折!
China-Pub 计算机绝版图书按需印刷服务

相关文章:

相关链接: