Proxy Auto Config(PAC)
什麼是 Proxy Auto Config ?
首先,我們一定要知道什麼是 Proxy?他的功用是什麼?如果還不知道,可以參照這份文件。
而 PAC(Proxy Auto Config) 又是什麼呢?它實際上是一個 Script;經由編寫這個 Script,我們可以讓系統判斷在怎麼樣的情形下,要利用哪一台 Proxy 來進行連線。這樣做主要的好處有:
分散 Proxy 的流量,避免 Proxy Server 負載過高
針對個別條件設定、加快瀏覽速度
設定要求順序,在某台 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。
範例:
isPlainHostName("www") 會 return true
isPlainHostName("www.netscape.com") 會 return false
--------------------------------------------------------------------------------
dnsDomainIs( host, domain )
host 由網址取得的主機名稱。
domain 指定的網域。
此 Function 會判斷 host 是否屬於網域 domain。如果是,則 return true;否,則 return false。
範例:
dnsDomainIs("www.netscape.com", ".netscape.com") 會 return true
dnsDomainIs("www", ".netscape.com") 會 return false
dnsDomainIs("www.mcom.com", ".netscape.com") 會 return false
--------------------------------------------------------------------------------
localHostOrDomainIs( host, hostdom )
host 由網址取得的主機名稱。
hostdom 完整的網域名稱。
此 Function 會判斷 host 是否為 hostdom,或 host 是否為 hostdom 的主機名稱。如果是,則 return true;否,則 return false。
範例:
localHostOrDomainIs("www.netscape.com", "www.netscape.com") 會 return true (完全相同)
localHostOrDomainIs("www", "www.netscape.com") 會 return true (主機名稱相同)
localHostOrDomainIs("www.mcom.com", "www.netscape.com") 會 return false (網域不同)
localHostOrDomainIs("home.netscape.com", "www.netscape.com") 會 return false (主機名稱不同)
--------------------------------------------------------------------------------
isResolvable( host )
host 由網址取得的主機名稱。
此 Function 會嘗試透過 DNS 去解析 host,如果解析成功,則 return true;否則 return false。
範例:
isResolvable("www.netscape.com") 會 return true (除非 DNS 無法正常運作)
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。
範例:
isInNet(host, "198.95.249.79", "255.255.255.255") 當 host 為 198.95.249.79 時,會 return true。
isInNet(host, "140.115.0.0", "255.255.0.0") 當 host 為 140.115.*.* 時,會 return true。
--------------------------------------------------------------------------------
dnsResolve( host )
host 要透過 DNS 解晰的主機名稱。
此 Function 會透過 DNS 去解析 host,return 值即為解析之結果。
範例:
dnsResolve("www.math.ncu.edu.tw") 會 return "140.115.25.9"。
--------------------------------------------------------------------------------
myIpAddress()
此 Function 會 return 瀏覽器所在電腦之 IP 位址。
--------------------------------------------------------------------------------
dnsDomainLevels( host )
host 由網址取得的主機名稱。
此 Function 會 return host 的 Domain 層數(點的數目)。
範例:
dnsDomainLevels("www") 會 return 0。
dnsDomainLevels("www.netscape.com") 會 return 2。
--------------------------------------------------------------------------------
shExpMatch( str, shexp )
str 要進行比對的字串。
shexp 比對的條件。
此 Function 會比對 str 是否符合 shexp 的表示式(此表示式為 shell expression 而非 regular expressions)。如果是,則 return true;否則 return false。
範例:
shExpMatch("http://home.netscape.com/people/ari/index.html", "*/ari/*") 會 return true
shExpMatch("http://home.netscape.com/people/montulli/index.html", "*/ari/*") 會 return false
--------------------------------------------------------------------------------
weekdayRange()、dateRange()、timeRange()
這三個 Function 的功用都是檢查線在時間是否在指定範圍內,用這些 Function 就可以設定分時段使用 Proxy Server。但由於較為繁瑣,如有興趣或需要,請參考原始文件。
範例:
首先,我們一定要知道什麼是 Proxy?他的功用是什麼?如果還不知道,可以參照這份文件。
而 PAC(Proxy Auto Config) 又是什麼呢?它實際上是一個 Script;經由編寫這個 Script,我們可以讓系統判斷在怎麼樣的情形下,要利用哪一台 Proxy 來進行連線。這樣做主要的好處有:
分散 Proxy 的流量,避免 Proxy Server 負載過高
針對個別條件設定、加快瀏覽速度
設定要求順序,在某台 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。
範例:
isPlainHostName("www") 會 return true
isPlainHostName("www.netscape.com") 會 return false
--------------------------------------------------------------------------------
dnsDomainIs( host, domain )
host 由網址取得的主機名稱。
domain 指定的網域。
此 Function 會判斷 host 是否屬於網域 domain。如果是,則 return true;否,則 return false。
範例:
dnsDomainIs("www.netscape.com", ".netscape.com") 會 return true
dnsDomainIs("www", ".netscape.com") 會 return false
dnsDomainIs("www.mcom.com", ".netscape.com") 會 return false
--------------------------------------------------------------------------------
localHostOrDomainIs( host, hostdom )
host 由網址取得的主機名稱。
hostdom 完整的網域名稱。
此 Function 會判斷 host 是否為 hostdom,或 host 是否為 hostdom 的主機名稱。如果是,則 return true;否,則 return false。
範例:
localHostOrDomainIs("www.netscape.com", "www.netscape.com") 會 return true (完全相同)
localHostOrDomainIs("www", "www.netscape.com") 會 return true (主機名稱相同)
localHostOrDomainIs("www.mcom.com", "www.netscape.com") 會 return false (網域不同)
localHostOrDomainIs("home.netscape.com", "www.netscape.com") 會 return false (主機名稱不同)
--------------------------------------------------------------------------------
isResolvable( host )
host 由網址取得的主機名稱。
此 Function 會嘗試透過 DNS 去解析 host,如果解析成功,則 return true;否則 return false。
範例:
isResolvable("www.netscape.com") 會 return true (除非 DNS 無法正常運作)
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。
範例:
isInNet(host, "198.95.249.79", "255.255.255.255") 當 host 為 198.95.249.79 時,會 return true。
isInNet(host, "140.115.0.0", "255.255.0.0") 當 host 為 140.115.*.* 時,會 return true。
--------------------------------------------------------------------------------
dnsResolve( host )
host 要透過 DNS 解晰的主機名稱。
此 Function 會透過 DNS 去解析 host,return 值即為解析之結果。
範例:
dnsResolve("www.math.ncu.edu.tw") 會 return "140.115.25.9"。
--------------------------------------------------------------------------------
myIpAddress()
此 Function 會 return 瀏覽器所在電腦之 IP 位址。
--------------------------------------------------------------------------------
dnsDomainLevels( host )
host 由網址取得的主機名稱。
此 Function 會 return host 的 Domain 層數(點的數目)。
範例:
dnsDomainLevels("www") 會 return 0。
dnsDomainLevels("www.netscape.com") 會 return 2。
--------------------------------------------------------------------------------
shExpMatch( str, shexp )
str 要進行比對的字串。
shexp 比對的條件。
此 Function 會比對 str 是否符合 shexp 的表示式(此表示式為 shell expression 而非 regular expressions)。如果是,則 return true;否則 return false。
範例:
shExpMatch("http://home.netscape.com/people/ari/index.html", "*/ari/*") 會 return true
shExpMatch("http://home.netscape.com/people/montulli/index.html", "*/ari/*") 會 return false
--------------------------------------------------------------------------------
weekdayRange()、dateRange()、timeRange()
這三個 Function 的功用都是檢查線在時間是否在指定範圍內,用這些 Function 就可以設定分時段使用 Proxy Server。但由於較為繁瑣,如有興趣或需要,請參考原始文件。
範例:
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.edu.tw:8080;" + " PROXY cache.edu.tw:8080;" + " DIRECT";
//如果網域是 .tw,則依序嘗試 proxy or cache or 直接連線
}else
return "PROXY cache.edu.tw:8080;" + " PROXY proxy.edu.tw:8080;" + " DIRECT";
//其他:依序嘗試 cache or proxy or 直接連線
Comments