GoogleWebAccelerator用的Proxy.pac代理原理介紹[轉]

GoogleWebAccelerator用的Proxy.pac代理原理介紹[轉]

2010-10-05 20:30:48| 分類: 默認分類 |字號 訂閱
GoogleWebAccelerator用的Proxy.pac代理原理介紹


Proxy Auto Config

什麼是 Proxy Auto Config ?

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

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()

· dnsDomainIs()

· localHostOrDomainIs()

· isResolvable()

· isInNet()

· dnsResolve()

· myIpAddress()

· dnsDomainLevels()

· shExpMatch()

· weekdayRange()

· dateRange()

· timeRange()


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.中央大學數學系之設定

2. function FindProxyForURL( url, host ){

3. if ( dnsDomainIs( host, "locahost" ) || dnsDomainIs( host, ".edu.tw" ) || isInNet( host, "140.0.0.0", "255.0.0.0" ) || isPlainHostName( host ) )

4. {

5. return "DIRECT; PROXY proxy.csie.ncu.edu.tw:3128;" + " PROXY cache.math.ncu.edu.tw:3128";

6. //localhost、 domain 是 .edu.tw、IP 爲 140.*.*.* 或只有 Host Name

7. //則直接聯機;如果直接聯機不行,則嘗試使用 proxy.csie 和 cache.math

8. }else if ( dnsDomainIs( host, ".tw" ) )

9. {

10. return "PROXY proxy.csie.ncu.edu.tw:3128;" + " PROXY cache.math.ncu.edu.tw:3128;" + " DIRECT";

11. //如果網域是 .tw,則依序嘗試 proxy.csie、cache.math、直接聯機

12. }else

13. return "PROXY cache.math.ncu.edu.tw:3128;" + " PROXY proxy.csie.ncu.edu.tw:3128;" + " DIRECT";

14. //其它:依序嘗試 cache.math、proxy.csie、直接聯機

15. }

16. 中央大學計算器中心提供之設定

17. function FindProxyForURL(url,host)

18. {

19. var RFC="1234567890-_qwertyuiopasdfghjklzxcvbnmQWERTYUIOPASDFGHJKLZXCVBNM.";

20. for(var i=0;i < host.length;i++)

21. {

22. var c=host.charAt(i);

23. if(RFC.indexOf(c)==-1 && !(dnsDomainIs(host, ".cc") || dnsDomainIs(host,".tw"))) {

24. // alert(url+"--"+host);

25. return "PROXY dnsrelay.twnic.net.tw:3127";

26. }

27. }

28. if(host == 'auto.search.msn.com')

29. return "PROXY keyword.twnic.net.tw:80";

30.

31. if(dnsDomainIs(host, ".tw"))

32. {

33. return "DIRECT";

34. }

35. return "PROXY proxy.ncu.edu.tw:3128; PROXY cache.ncu.edu.tw:3128; DIRECT";
36. }
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章