1. 程式人生 > >IE自動配置指令碼(PAC)

IE自動配置指令碼(PAC)

針對不同網頁使用不同代理 —— IE自動配置指令碼


1.前言
2.自動配置指令碼簡介
3.自動配置指令碼語法
4.相關例子
         a、isPlainHostName(host)
         b、dnsDomainIs(host, "")、localHostOrDomainIs(host, "")
         c、isResolvable(host)
         d、isInNet(host, "", "")
         e、shExpMatch(host, "")
         f、url.substring()
         g、dnsResolve(host)
         h、myIpAddress()
         i、dnsDomainLevels(host)
         j、weekdayRange()
         k、隨機使用代理

1.前言
有些朋友會問為什麼tw沒有自動代理的功能,其實IE本身就有這個功能,只要有一點點JS知識,你可以自己手動編寫一個最適合自己的IE代理指令碼。

2.自動配置指令碼簡介


自動配置指令碼起的作用就是,當IE訪問網頁的時候會根據指令碼檔案裡面界定的內容來訪問。比方說,你在指令碼檔案裡面限定了訪問某些IP使用某個代理的時候,訪問另外一些IP使用另外的代理,這就很方便通過指令碼檔案來完成。

3.自動配置指令碼語法
一個PAC檔案其實就是一個文字檔案,最簡單的格式就是包含一個叫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 == "www.mydomain.com")
return "DIRECT";
return "PROXY myproxy:80;
PROXY myotherproxy:8080;
DIRECT";
}
把以上程式碼另存為proxy.pac的檔案,如:e:/proxy.pac,然後在IE的選單裡"工具"->"INTEL選項"->"連線"->區域網設定

把使用自動配置指令碼選上,然後在位址列填入file://e:/proxy.pac,注意file後是兩斜槓,要使設定生效,需要關閉IE再重新開啟.


現在我們介紹下這個proxy.pac指令碼檔案,指令碼的語法是js語法,js的內建函式可以使用,要實現自動配置代理,需要實現FindProxyForURL這個函式,其引數url代表要訪問的連線,host代表要訪問連線的主機名,該函式有三個返回引數
direct:直接連線
proxy IP:PORT
socket IP:PORT
返回結果大小寫不敏感


PAC指令碼另外一個重要的應用是多臺代理伺服器並存的情況下,通過pac指令碼的控制:

使用者隨機選擇使用多臺代理伺服器中的任意一臺來達到流量負載均衡的目的;
管理員通過PAC指令碼控制使用者使用和不使用某臺代理伺服器,這樣可以空出時間對代理伺服器進行維護;
讓伺服器工作在主備模式,當主伺服器宕機時,會自動切換到其它備用伺服器而不會中斷服務;
根據訪問目的地的不同,自動選擇最佳代理伺服器。


4.相關例子
下面列舉幾個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(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";
       }
   }
 
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;
      }   
}