用本本上网时,往返家里和单位,因为单位是用的代理上网,家里是直接连接.因此每次都要修改IE的代理设置,虽然是个小事,但是每次都要修改总是有点烦自动配置IE代理脚本_代理服务器,于是参考GOOGLE,写了一个自动配置代理的脚本.这样无论在家和在公司,只要连上局域网就可以上网了自动配置IE代理脚本_直接访问_02.


自动配置IE代理脚本_服务器_03自动配置IE代理脚本_ipad_04function FindProxyForURL(url,host)自动配置IE代理脚本_ipad_05{

自动配置IE代理脚本_代理服务器_06自动配置IE代理脚本_直接访问_07    if((isPlainHostName(host))||shExpMatch(url,"http://127.0.0.1/*")||isInNet(host,"192.168.0.0", "255.255.255.0"))自动配置IE代理脚本_ipad_05{

自动配置IE代理脚本_主机名_09        return "direct";

自动配置IE代理脚本_代理服务器_06自动配置IE代理脚本_直接访问_07    } else 自动配置IE代理脚本_ipad_05{

自动配置IE代理脚本_主机名_09          if(myIpAddress()=="192.168.0.49")

自动配置IE代理脚本_主机名_09               return "PROXY 192.168.0.6:808";

自动配置IE代理脚本_主机名_09        else

自动配置IE代理脚本_主机名_09              return "direct";

自动配置IE代理脚本_ipad_17    }

自动配置IE代理脚本_ipad_18}

自动配置IE代理脚本_直接访问_19


把以上代码另存为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/

  的方式访问,如果是直接连接,否则使用代理


自动配置IE代理脚本_直接访问_19  function FindProxyForURL(url, host)

自动配置IE代理脚本_服务器_03自动配置IE代理脚本_ipad_04  自动配置IE代理脚本_ipad_05{

自动配置IE代理脚本_主机名_09    if (isPlainHostName(host))

自动配置IE代理脚本_主机名_09      return "DIRECT";

自动配置IE代理脚本_主机名_09    else

自动配置IE代理脚本_主机名_09      return "PROXY proxy:80";

自动配置IE代理脚本_ipad_18  }


  

  b、dnsDomainIs(host, "")、localHostOrDomainIs(host, ""),本例演示判断访问主机

  是否属于某个域和某个域名,如果属于.company.com域的主机名,而域名不是

  www.company.com和home.company.com的直接连接,否则使用代理访问。

 


自动配置IE代理脚本_直接访问_19 function FindProxyForURL(url, host)

自动配置IE代理脚本_服务器_03自动配置IE代理脚本_ipad_04  自动配置IE代理脚本_ipad_05{

自动配置IE代理脚本_主机名_09    if ((isPlainHostName(host) ||

自动配置IE代理脚本_主机名_09       dnsDomainIs(host, ".company.com")) &&

自动配置IE代理脚本_主机名_09      !localHostOrDomainIs(host, "www.company.com") &&

自动配置IE代理脚本_主机名_09      !localHostOrDomainIs(host, "home.company.com"))

自动配置IE代理脚本_主机名_09

自动配置IE代理脚本_主机名_09      return "DIRECT";

自动配置IE代理脚本_主机名_09    else

自动配置IE代理脚本_主机名_09      return "PROXY proxy:80";

自动配置IE代理脚本_ipad_18  }

自动配置IE代理脚本_直接访问_19


  

  c、isResolvable(host),本例演示主机名能否被dns服务器解析,如果能直接访问,否

  则就通过代理访问。

 


自动配置IE代理脚本_直接访问_19 function FindProxyForURL(url, host)

自动配置IE代理脚本_服务器_03自动配置IE代理脚本_ipad_04  自动配置IE代理脚本_ipad_05{

自动配置IE代理脚本_主机名_09    if (isResolvable(host))

自动配置IE代理脚本_主机名_09      return "DIRECT";

自动配置IE代理脚本_主机名_09    else

自动配置IE代理脚本_主机名_09      return "PROXY proxy:80";

自动配置IE代理脚本_ipad_18  }

自动配置IE代理脚本_直接访问_19


  

  d、isInNet(host, "", ""),本例演示访问IP是否在某个子网内,如果是就直接访问,

  否则就通过代理,例子演示访问清华IP段的主页不用代理。

  


自动配置IE代理脚本_直接访问_19function FindProxyForURL(url, host)

自动配置IE代理脚本_服务器_03自动配置IE代理脚本_ipad_04自动配置IE代理脚本_ipad_05{

自动配置IE代理脚本_主机名_09    if (isInNet(host, "166.111.0.0", "255.255.0.0"))

自动配置IE代理脚本_主机名_09      return "DIRECT";

自动配置IE代理脚本_主机名_09    else

自动配置IE代理脚本_主机名_09      return "PROXY proxy:80";

自动配置IE代理脚本_ipad_18}


 

e、shExpMatch(host, ""),本例演示根据主机域名来改变连接类型,本地主机、*.edu、

  *.com分别用不同的连接方式。


自动配置IE代理脚本_直接访问_19  function FindProxyForURL(url, host)

自动配置IE代理脚本_服务器_03自动配置IE代理脚本_ipad_04  自动配置IE代理脚本_ipad_05{

自动配置IE代理脚本_主机名_09    if (isPlainHostName(host))

自动配置IE代理脚本_主机名_09      return "DIRECT";

自动配置IE代理脚本_主机名_09    else if (shExpMatch(host, "*.com"))

自动配置IE代理脚本_主机名_09      return "PROXY comproxy:80";

自动配置IE代理脚本_主机名_09    else if (shExpMatch(host, "*.edu"))

自动配置IE代理脚本_主机名_09      return "PROXY eduproxy:80";

自动配置IE代理脚本_主机名_09    else

自动配置IE代理脚本_主机名_09      return "PROXY proxy:80";

自动配置IE代理脚本_ipad_18  }


 

f、url.substring(),本例演示根据不同的协议来选择不同的代理,http、https、ftp、

  gopher分别使用不同的代理。


自动配置IE代理脚本_直接访问_19  function FindProxyForURL(url, host)

自动配置IE代理脚本_服务器_03自动配置IE代理脚本_ipad_04  自动配置IE代理脚本_ipad_05{

自动配置IE代理脚本_代理服务器_06自动配置IE代理脚本_直接访问_07      if (url.substring(0, 5) == "http:") 自动配置IE代理脚本_ipad_05{

自动配置IE代理脚本_主机名_09        return "PROXY proxy:80";

自动配置IE代理脚本_ipad_17      }

自动配置IE代理脚本_代理服务器_06自动配置IE代理脚本_直接访问_07      else if (url.substring(0, 4) == "ftp:") 自动配置IE代理脚本_ipad_05{

自动配置IE代理脚本_主机名_09        return "PROXY fproxy:80";

自动配置IE代理脚本_ipad_17      }

自动配置IE代理脚本_代理服务器_06自动配置IE代理脚本_直接访问_07      else if (url.substring(0, 7) == "gopher:") 自动配置IE代理脚本_ipad_05{

自动配置IE代理脚本_主机名_09        return "PROXY gproxy";

自动配置IE代理脚本_ipad_17      }

自动配置IE代理脚本_代理服务器_06自动配置IE代理脚本_直接访问_07      else if (url.substring(0, 6) == "https:") 自动配置IE代理脚本_ipad_05{

自动配置IE代理脚本_主机名_09        return "PROXY secproxy:8080";

自动配置IE代理脚本_ipad_17      }

自动配置IE代理脚本_代理服务器_06自动配置IE代理脚本_直接访问_07      else 自动配置IE代理脚本_ipad_05{

自动配置IE代理脚本_主机名_09        return "DIRECT";

自动配置IE代理脚本_ipad_17      }

自动配置IE代理脚本_ipad_18  }


  

  g、dnsResolve(host),本例演示判断访问主机是否某个IP,如果是就使用代理,否则直

  接连接。


自动配置IE代理脚本_直接访问_19function FindProxyForURL(url, host)

自动配置IE代理脚本_服务器_03自动配置IE代理脚本_ipad_04自动配置IE代理脚本_ipad_05{

自动配置IE代理脚本_代理服务器_06自动配置IE代理脚本_直接访问_07   if (dnsResolve(host) == "166.111.8.237") 自动配置IE代理脚本_ipad_05{

自动配置IE代理脚本_主机名_09        return "PROXY secproxy:8080";

自动配置IE代理脚本_ipad_17      }

自动配置IE代理脚本_代理服务器_06自动配置IE代理脚本_直接访问_07      else 自动配置IE代理脚本_ipad_05{

自动配置IE代理脚本_主机名_09        return "PROXY proxy:80";

自动配置IE代理脚本_ipad_17      }

自动配置IE代理脚本_ipad_18}


  

  h、myIpAddress(),本例演示判断本地IP是否某个IP,如果是就使用代理,否则直接使

  用连接。


自动配置IE代理脚本_直接访问_19  function FindProxyForURL(url, host)

自动配置IE代理脚本_服务器_03自动配置IE代理脚本_ipad_04  自动配置IE代理脚本_ipad_05{

自动配置IE代理脚本_代理服务器_06自动配置IE代理脚本_直接访问_07      if (myIpAddress() == "166.111.8.238") 自动配置IE代理脚本_ipad_05

自动配置IE代理脚本_主机名_09        return "PROXY proxy:80";

自动配置IE代理脚本_ipad_17      }

自动配置IE代理脚本_代理服务器_06自动配置IE代理脚本_直接访问_07      else 自动配置IE代理脚本_ipad_05{

自动配置IE代理脚本_主机名_09        return "DIRECT";

自动配置IE代理脚本_ipad_17      }

自动配置IE代理脚本_ipad_18  }


  

  i、dnsDomainLevels(host),本例演示访问主机的域名级数是几级,就是域名有几个点

  如果域名中有点,就通过代理访问,否则直接连接。

 


自动配置IE代理脚本_直接访问_19 function FindProxyForURL(url, host)

自动配置IE代理脚本_服务器_03自动配置IE代理脚本_ipad_04  自动配置IE代理脚本_ipad_05{

自动配置IE代理脚本_代理服务器_06自动配置IE代理脚本_直接访问_07      if (dnsDomainLevels(host) > 0) 自动配置IE代理脚本_ipad_05{ // if number of dots in host > 0

自动配置IE代理脚本_主机名_09        return "PROXY proxy:80";

自动配置IE代理脚本_ipad_17      }

自动配置IE代理脚本_主机名_09        return "DIRECT";

自动配置IE代理脚本_ipad_18  }


  

  j、weekdayRange(),本例演示当前日期的范围来改变使用代理,如果是GMT时间周三

  到周六,使用代理连接,否则直接连接。


自动配置IE代理脚本_直接访问_19  function FindProxyForURL(url, host)

自动配置IE代理脚本_服务器_03自动配置IE代理脚本_ipad_04  自动配置IE代理脚本_ipad_05{

自动配置IE代理脚本_主机名_09    if(weekdayRange("WED", "SAT", "GMT")) 

自动配置IE代理脚本_主机名_09     return "PROXY proxy:80";

自动配置IE代理脚本_主机名_09    else 

自动配置IE代理脚本_主机名_09     return "DIRECT";

自动配置IE代理脚本_ipad_18  }


  

  k、最后一个例子是演示随机使用代理,这样可以好好利用代理服务器。


自动配置IE代理脚本_直接访问_19function FindProxyForURL(url,host)

自动配置IE代理脚本_服务器_03自动配置IE代理脚本_ipad_04自动配置IE代理脚本_ipad_05{

自动配置IE代理脚本_主机名_09      return randomProxy();

自动配置IE代理脚本_ipad_18}

自动配置IE代理脚本_直接访问_19

自动配置IE代理脚本_直接访问_19function randomProxy()

自动配置IE代理脚本_服务器_03自动配置IE代理脚本_ipad_04自动配置IE代理脚本_ipad_05{

自动配置IE代理脚本_主机名_09     switch( Math.floor( Math.random() * 5 ) )

自动配置IE代理脚本_代理服务器_06自动配置IE代理脚本_直接访问_07     自动配置IE代理脚本_ipad_05{

自动配置IE代理脚本_主机名_09         case 0:

自动配置IE代理脚本_主机名_09             return "PROXY proxy1:80";

自动配置IE代理脚本_主机名_09             break;

自动配置IE代理脚本_主机名_09         case 1:

自动配置IE代理脚本_主机名_09             return "PROXY proxy2:80"; 

自动配置IE代理脚本_主机名_09             break;

自动配置IE代理脚本_主机名_09         case 2:

自动配置IE代理脚本_主机名_09             return "PROXY proxy3:80";

自动配置IE代理脚本_主机名_09             break;

自动配置IE代理脚本_主机名_09         case 3:

自动配置IE代理脚本_主机名_09             return "PROXY proxy4:80";

自动配置IE代理脚本_主机名_09             break;

自动配置IE代理脚本_主机名_09         case 4:

自动配置IE代理脚本_主机名_09             return "PROXY proxy5:80";

自动配置IE代理脚本_主机名_09             break;

自动配置IE代理脚本_ipad_17     }    

自动配置IE代理脚本_ipad_18}

自动配置IE代理脚本_直接访问_19