hi.baidu/cayrus/blog/item/2800503989cad6fd14cecb50.html
【转】 自动切换IE代理设置: 简单使用IE自动配置脚本
苏紫紫写真因为工作需要,经常需要在家里和办公场所使用同一台电脑,由于家里不需要设置浏览器的代理,而在办公场所就需要设置。所以每次都需要修改,换WINDOWS7之前一直使用IBM版本的Access Connections(以下简称AC)来切换网络设置,很强大,很方便,但遗憾的是IBM版本的AC不支持WIN7,而ThinkpAdvantage系列的AC是有名的臭名昭著——会导致开机缓慢。下了几个IP切换软件,却都少有IE代理切换功能,IPHELPER倒是提供IE代理配置,但公司网中使用的是“IE自动配置脚本”,设定了对内网访问时不使用代理,连接外网时才使用代理。无奈之下深入研究了一下这个IE自动配置脚本的原理,发现原来它就可以实现我所需要的功能(当然IP地址切换功能除外,但提供这个功能的小软件海了去了~),使用IE自动配置脚本,就可以不用每次在单位和家之间手动设置IE代理了~只需要加上一行代码即可~(当然这行代码来之不易,其实学过计算机二级考过了C语言的童鞋们只要静下心来看一看下面的介绍,应该就对IE自动配置脚本一清二楚了~)
1. 什么是IE自动配置脚本
IE自动配置脚本起的作用就是,当IE访问网页的时候会根据脚本文件里面界定的内容来访问。比方说,你在脚本文件里面限定了访问某些IP使用某个代理的时候,访问另外一些IP使用另外的代理,这就很方便通过脚本文件来完成。
2. 如何创建、编辑IE自动配置脚本
1)创建:打开WINDOWS自带的记事本,编辑好代码后另存为“.PAC”格式
2)编辑:使用WINDOWS自带的记事本即可。
3. 如何编写IE自动配置脚本
最简单的格式就是包含一个叫FindProxyForURL的JScript函数,IE通过传入两个变量来调用这个函数,一个是用户浏览的地址URL全路经,一个是这个URL中的主机名部分(host)。
这个FindProxyForURL函数有三种可能的字符串返回值,一是"DIRECT",就是直接连接,不通过代理;二是"PROXY proxyaddr:port",其中proxyaddr和port分别是代理的地址和代理的端口;三是"SOCKS socksaddr:port",其中socksaddr和port分别是socks代理的地址和端口,一个自动代理文件可以是多个选择的组合,其中用分号(;)隔开,如:
      function FindProxyForURL(url,host)
      {
      if (host == "")
      return "DIRECT";
      return "PROXY myproxy:80;
      PROXY myotherproxy:8080;
      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脚本另外一个重要的应用是多台代理服务器并存的情况下,通过pac脚本的控制,可以实现如下目标:
使用户随机选择使用多台代理服务器中的任意一台来达到流量负载均衡的目的;
使管理员通过PAC脚本控制用户使用和不使用某台代理服务器,这样可以空出时间对代理服务器进行维护;
让服务器工作在主备模式,当主服务器宕机时,会自动切换到其它备用服务器而不会中断服务;
根据访问目的地的不同,自动选择最佳代理服务器。
下面我们介绍几个常用的PAC函数,并举便说明:
  <1 isPlainHostName(host),判断是否为本地主机,例如以myservername/的方式访问,则是直接连接,否则使用代理
        function FindProxyForURL(url, host)
        {
          if (isPlainHostName(host))
            return "DIRECT";
          else
            return "PROXY proxy:80";
        }
    <2 dnsDomainIs(host, "")、localHostOrDomainIs(host, ""),判断所访问主机是否属
于某个域和某个域名,例如属于pany域的主机名,wwwpany和homepany的直接连接,否则使用代理访问。
        function FindProxyForURL(url, host)
        {
          if ((isPlainHostName(host) ||
            dnsDomainIs(host, "pany")) &&
            !localHostOrDomainIs(host, "wwwpany") &&
            !localHostOrDomainIs(host, "homepany"))
            return "DIRECT";
          else
            return "PROXY proxy:80";
        }
  <3 isResolvable(host),判断被访问主机名能否被解析.例子演示主机名能否被dns服务器解析,如果能直接访问,否则就通过代理访问。
        function FindProxyForURL(url, host)
        {
陈晓旭资料
          if (isResolvable(host))
琳赛 罗韩            return "DIRECT";
          else
四枫院夜一            return "PROXY proxy:80";
        }
  <4 isInNet(host, "", ""),判断IP是否在某个子网内.例子演示访问IP段的主页不使用代
理。
      function FindProxyForURL(url, host)
      {
          if (isInNet(host, "10.0.0.0", "255.255.0.0"))
            return "DIRECT";
          else
            return "PROXY proxy:80";
      }
  <5 shExpMatch(host, ""),判断被访问主机名是否符合某一正则表达式.本例演示根据主机域名来改变连接类型,本地主机、*.edu、*分别用不同的连接方式。
        function FindProxyForURL(url, host)
        {
          if (isPlainHostName(host))
            return "DIRECT";
          else if (shExpMatch(host, "*"))
            return "PROXY comproxy:80";
          else if (shExpMatch(host, "*.edu"))
            return "PROXY eduproxy:80";
          else
            return "PROXY proxy:80";
        }
   
小满诗句  <6 url.substring(),取URL字符串的子串.本例演示根据不同的协议来选择不同的代理,http、https、ftp、gopher分别使用不同的代理。
        function FindProxyForURL(url, host)
        {
            if (url.substring(0, 5) == "http:") {
              return "PROXY proxy:80";
            }
            else if (url.substring(0, 4) == "ftp:") {
              return "PROXY fproxy:80";
            }
            else if (url.substring(0, 7) == "gopher:") {
              return "PROXY gproxy";
            }
            else if (url.substring(0, 6) == "https:") {
佳士得国际拍卖              return "PROXY secproxy:8080";
            }
            else {
              return "DIRECT";
            }