Proxy Auto Config


什麼是 Proxy Auto Config ?

首先,我們一定要知道什麼是 Proxy?他的功用是什麼?如果還不知道,可以參照維基百科

而 PAC(Proxy Auto Config)又是什麼呢?它實際上是一個 Script;經由編寫這個 Script,我們可以讓系統判斷在怎麼樣的情形下,要利用哪一台 Proxy Server 來進行連線。這樣做主要的好處有:

  1. 分散 Proxy 的流量,避免 Proxy Server 負載過高
  2. 針對個別條件設定、加快瀏覽速度
  3. 設定要求順序,在某台 Proxy 無法連線時,可自動嘗試別種連線方式

Proxy Auto Config File 的格式

基本上 Proxy Auto Config File(以下簡稱 PAC)是一個純文字檔,他的程式採用 JavaScript 這個語言;所以建議要學習編寫 PAC 的人,最好先學習基本的 JavaScript。而一個 PAC 檔必需是單獨的 JavaScript,其中不能包含任何 HTML 標籤。

在 PAC 檔中,一定要定義 Function FindProxyForURL 如下:

function FindProxyForURL( url, host )
{
  ...
}

如果使用了 PAC 檔,則瀏覽器在接受我們要求的網址後,會去執行

ret = FindProxyForURL( url, host );

這樣的指令。其中,url 是所要求網址的完整路徑,host 是對方的電腦名稱(就是在 :// 和 / 之中的部份);而 return 值 ret 則是 Proxy 的組態,它的格式有下列三種:

  • DIRECT 直接連線而不透過 Proxy
  • PROXY host:port 使用指定的 Proxy 伺服機
  • SOCKS host:port 使用指定的 Socks 伺服機

比如說當瀏覽器得到的是 Proxy proxy.ncu.edu.tw:3128; Proxy proxy.csie.ncu.edu.tw:3128; DIRECT 的話,那瀏覽器會先嘗試透過 proxy.ncu.edu.tw 來開啟網頁,如果無法使用,則嘗試 proxy.csie.ncu.edu.tw,還是不行的話,就直接連線。

 

PAC 中特別的 Function

在 PAC 中,除了可以使用一般 JavaScript 的 Function 外,它還定義了一些特別的 Function 可以使用:

isPlainHostName( host )

  • host 由網址取得的主機名稱。

此 Function 會判斷 host 是否為不包含網域 (Domain)。如果是,則 return true;如果包含,則 return false。

範例:

  1. isPlainHostName("www") 會 return true
  2. isPlainHostName("www.netscape.com") 會 return false

    dnsDomainIs( host, domain )

    • host 由網址取得的主機名稱。
    • domain 指定的網域。

    此 Function 會判斷 host 是否屬於網域 domain。如果是,則 return true;否,則 return false。

    範例:

    1. dnsDomainIs("www.netscape.com", ".netscape.com") 會 return true
    2. dnsDomainIs("www", ".netscape.com") 會 return false
    3. dnsDomainIs("www.mcom.com", ".netscape.com") 會 return false

      localHostOrDomainIs( host, hostdom )

      • host 由網址取得的主機名稱。
      • hostdom 完整的網域名稱。

      此 Function 會判斷 host 是否為 hostdom,或 host 是否為 hostdom 的主機名稱。如果是,則 return true;否,則 return false。

      範例:

      1. localHostOrDomainIs("www.netscape.com", "www.netscape.com") 會 return true (完全相同)
      2. localHostOrDomainIs("www", "www.netscape.com") 會 return true (主機名稱相同)
      3. localHostOrDomainIs("www.mcom.com", "www.netscape.com") 會 return false (網域不同)
      4. localHostOrDomainIs("home.netscape.com", "www.netscape.com") 會 return false (主機名稱不同)

        isResolvable( host )

        • host 由網址取得的主機名稱。

        此 Function 會嘗試透過 DNS 去解析 host,如果解析成功,則 return true;否則 return false。

        範例:

        1. isResolvable("www.netscape.com") 會 return true (除非 DNS 無法正常運作)
        2. isResolvable("bogus.domain.foobar") 會 return false (除非真的冒出這個 domain 出來…)

          isInNet( host, pattern, mask )

          • host 主機名稱,可以是 Domain Name 或 IP。如果是 Domain Name,則會透過 DNS 查出 IP。

            pattern IP。

          • mask 對應於 pattern 的遮罩。

          此 Function 會 host 是否在指定的 IP 範圍內,如果是,則 return true;否則 return false。

          範例:

          1. isInNet(host, "198.95.249.79", "255.255.255.255")host 為 198.95.249.79 時,會 return true。
          2. isInNet(host, "140.115.0.0", "255.255.0.0")host 為 140.115.*.* 時,會 return true。

            dnsResolve( host )

            • host 要透過 DNS 解晰的主機名稱。

            此 Function 會透過 DNS 去解析 host,return 值即為解析之結果。

            範例:

            1. dnsResolve("www.math.ncu.edu.tw") 會 return "140.115.25.9"。

              myIpAddress()

              此 Function 會 return 瀏覽器所在電腦之 IP 位址。

              dnsDomainLevels( host )

              • host 由網址取得的主機名稱。

              此 Function 會 return host 的 Domain 層數(點的數目)。

              範例:

              1. dnsDomainLevels("www") 會 return 0。
              2. dnsDomainLevels("www.netscape.com") 會 return 2。

                shExpMatch( str, shexp )

                • str 要進行比對的字串。
                • shexp 比對的條件。

                此 Function 會比對 str 是否符合 shexp 的表示式(此表示式為 shell expression 而非 regular expressions)。如果是,則 return true;否則 return false。

                範例:

                1. shExpMatch("http://home.netscape.com/people/ari/index.html", "*/ari/*") 會 return true
                2. shExpMatch("http://home.netscape.com/people/montulli/index.html", "*/ari/*") 會 return false

                  weekdayRange()dateRange()timeRange()

                  這三個 Function 的功用都是檢查線在時間是否在指定範圍內,用這些 Function 就可以設定分時段使用 Proxy Server。但由於較為繁瑣,如有興趣或需要,請參考原始文件

                  範例
                  1. 中央大學數學系之設定

                    function FindProxyForURL( url, host ){
                     if ( dnsDomainIs( host, "locahost" ) || dnsDomainIs( host, ".edu.tw" ) || isInNet( host, "140.0.0.0", "255.0.0.0" ) || isPlainHostName( host ) )
                     {
                      return "DIRECT; PROXY proxy.csie.ncu.edu.tw:3128;" + " PROXY cache.math.ncu.edu.tw:3128";
                      //localhost、 domain 是 .edu.tw、IP 為 140.*.*.* 或只有 Host Name
                      //則直接連線;如果直接連線不行,則嘗試使用 proxy.csie 和 cache.math
                     }else if ( dnsDomainIs( host, ".tw" ) )
                     {
                      return "PROXY proxy.csie.ncu.edu.tw:3128;" + " PROXY cache.math.ncu.edu.tw:3128;" + " DIRECT";
                      //如果網域是 .tw,則依序嘗試 proxy.csie、cache.math、直接連線
                     }else
                      return "PROXY cache.math.ncu.edu.tw:3128;" + " PROXY proxy.csie.ncu.edu.tw:3128;" + " DIRECT";
                      //其他:依序嘗試 cache.math、proxy.csie、直接連線
                    }
                  2. 中央大學計算機中心提供之設定

                    function FindProxyForURL(url,host)
                    {
                     var RFC="1234567890-_qwertyuiopasdfghjklzxcvbnmQWERTYUIOPASDFGHJKLZXCVBNM.";
                     for(var i=0;i < host.length;i++)
                     {
                      var c=host.charAt(i);
                      if(RFC.indexOf(c)==-1 && !(dnsDomainIs(host, ".cc") || dnsDomainIs(host,".tw"))) {
                    //      alert(url+"--"+host);
                       return "PROXY dnsrelay.twnic.net.tw:3127";
                      }
                     }
                     if(host == 'auto.search.msn.com')
                      return "PROXY keyword.twnic.net.tw:80";
                     if(dnsDomainIs(host, ".tw"))
                     {
                      return "DIRECT";
                     }
                     return "PROXY proxy.ncu.edu.tw:3128; PROXY cache.ncu.edu.tw:3128; DIRECT";
                    }
                  參考資料

                  發表迴響

                  在下方填入你的資料或按右方圖示以社群網站登入:

                  WordPress.com 標誌

                  您的留言將使用 WordPress.com 帳號。 登出 /  變更 )

                  Google photo

                  您的留言將使用 Google 帳號。 登出 /  變更 )

                  Twitter picture

                  您的留言將使用 Twitter 帳號。 登出 /  變更 )

                  Facebook照片

                  您的留言將使用 Facebook 帳號。 登出 /  變更 )

                  連結到 %s

                  This site uses Akismet to reduce spam. Learn how your comment data is processed.