惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

Security Archives - TechRepublic
Security Archives - TechRepublic
Project Zero
Project Zero
K
Kaspersky official blog
G
Google Developers Blog
T
Threat Research - Cisco Blogs
T
The Blog of Author Tim Ferriss
Cyberwarzone
Cyberwarzone
Y
Y Combinator Blog
Recorded Future
Recorded Future
Blog — PlanetScale
Blog — PlanetScale
Threat Intelligence Blog | Flashpoint
Threat Intelligence Blog | Flashpoint
Cisco Talos Blog
Cisco Talos Blog
Latest news
Latest news
Microsoft Security Blog
Microsoft Security Blog
H
Help Net Security
S
Schneier on Security
P
Palo Alto Networks Blog
H
Hacker News: Front Page
N
News and Events Feed by Topic
N
Netflix TechBlog - Medium
博客园 - Franky
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
SecWiki News
SecWiki News
Cloudbric
Cloudbric
TaoSecurity Blog
TaoSecurity Blog
CTFtime.org: upcoming CTF events
CTFtime.org: upcoming CTF events
The Hacker News
The Hacker News
C
Check Point Blog
L
LangChain Blog
腾讯CDC
小众软件
小众软件
T
Tenable Blog
Google DeepMind News
Google DeepMind News
GbyAI
GbyAI
L
LINUX DO - 最新话题
A
About on SuperTechFans
Google Online Security Blog
Google Online Security Blog
C
Cisco Blogs
Recent Announcements
Recent Announcements
Hacker News: Ask HN
Hacker News: Ask HN
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
Vercel News
Vercel News
雷峰网
雷峰网
美团技术团队
D
DataBreaches.Net
Martin Fowler
Martin Fowler
Help Net Security
Help Net Security
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
F
Full Disclosure
博客园_首页

博客园 - 大口仔

网上邻居访问提示"未授予用户在此计算机上的请求登录类型"的解决 获取保存在路由器中的ADSL账号和密码 GX DM800遥控TV设置 硅钢片铁芯、坡莫合金、非晶及纳米晶软磁合金 在HTML中显示回车和空格 - 大口仔 - 博客园 n!和 Fibnoacci函数的递归与非递归 SQL Server和Oracle的常用函数对比 DD-WRT 上 VPN 的设置 - 大口仔 数据绑定以及Container.DataItem - 大口仔 - 博客园 css文本 jQuery插件 用户控件路径的解决方案 - 大口仔 - 博客园 CSS属性大全 关闭excel进程 c# 枚举基础 与 枚举属性的访问 首字母大写 SQL Server 2005之PIVOT/UNPIVOT行列转换 Excel导出方法总结
自动配置IE代理脚本 - 大口仔 - 博客园
大口仔 · 2009-06-03 · via 博客园 - 大口仔

用本本上网时,往返家里和单位,因为单位是用的代理上网,家里是直接连接.因此每次都要修改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;
     }
    
}