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. }
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. }
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.