最近看了 HTTP權威指南 里面有關於 代理的介紹,代理有很多種,今天主要來說說 自動代理PAC
PAC(Proxy Auto Config) 是一個 Script;經由編寫這個 Script,我們可以讓系統判斷在怎么樣的情形下,要利用哪一台 Proxy 來進行聯機
PAC文件是純文本格式的,實際上也是個Javascript文件。
在PAC文件中一定要定義 Function FindProxyForURL
//參數url是用戶輸入的url,參數host是url中的主機名。 function FindProxyForURL(url, host) { ... }
此方法需要會return 一個Proxy動態組
值 | 描述 | 樣例 |
DIRECT | 直接聯機而不透過 Proxy | return "DIRECT"; |
PROXY host:port | 使用指定的 Proxy 伺服機 | return "192.168.22.22:3128;192.168.22.23:3128"; |
SOCKS host:port | 使用指定的 Socks 伺服機 | return "SOCKS5 127.0.0.1:1080; SOCKS 127.0.0.1:1080; DIRECT;"; |
關於 最后面的一個樣例我解釋下(其實就是順序問題):
1:先通過 ‘SOCKS5 127.0.0.1:1080’ 這個SOCKS5代理連接
2:如果1不行,通過‘SOCKS 127.0.0.1:1080’這個SOCKS代理連接
3:如果前面都不行,那就直接連接不走代理了
完整事例
事例一:
var domains = { "google.com": 1, "facebook.com": 1, "bing.com":1 }; var proxy = "SOCKS5 127.0.0.1:1080; SOCKS 127.0.0.1:1080; DIRECT;"; var direct = 'DIRECT;'; function FindProxyForURL(url, host) { var lastPos; do { if (domains.hasOwnProperty(host)) { return proxy; } lastPos = host.indexOf('.') + 1; host = host.slice(lastPos); } while (lastPos >= 1); return direct; }
事例二:
function FindProxyForURL(url, host) { if (shExpMatch(url,"*.google.com/*")) { return "PROXY 192.168.22.22:3128"; } if (shExpMatch(url, "*.wikipedia.com:*/*")) { return "SOCKS5 www.54php.cn:1080"; } if (isInNet(host, "10.0.0.0", "255.0.0.0")){ return "DIRECT"; } return "DIRECT; PROXY 192.168.22.22:3128; SOCKS5 www.54php.cn:1080"; }
PAC文件可以使用的JavaScript函數
isPlainHostName | isPlainHostName( host ) host 由網址取得的主機名稱。此 Function 會判斷 host 是否為不包含網域 (Domain)。如果是,則 return true;如果包含,則 return false。 |
dnsDomainIs | dnsDomainIs( host, domain )host 由網址取得的主機名稱。domain 指定的網域。此 Function 會判斷 host 是否屬於網域 domain。如果是,則 return true;否,則 return false。 |
localHostOrDomainIs | localHostOrDomainIs( host, hostdom )host 由網址取得的主機名稱。hostdom 完整的網域名稱。此 Function 會判斷 host 是否為 hostdom,或 host 是否為 hostdom 的主機名稱。如果是,則 return true;否,則 return false。 |
isResolvable | isResolvable( host )host 由網址取得的主機名稱。此 Function 會嘗試透過 DNS 去解析 host,如果解析成功,則 return true;否則 return false。 |
isInNet | isInNet( host, pattern, mask )host主機名稱,可以是 Domain Name 或 IP。如果是 Domain Name,則會透過 DNS 查出 IP。pattern IP。mask對應於 pattern 的屏蔽。此 Function 會 host 是否在指定的 IP 范圍內,如果是,則 return true;否則 return false。 |
dnsResolve | dnsResolve( host )host 要透過 DNS 解晰的主機名稱。此 Function 會透過 DNS 去解析 host,return 值即為解析之結果。 |
myIpAddress | myIpAddress()此 Function 會 return 瀏覽器所在計算機之 IP 地址。 |
dnsDomainLevels | dnsDomainLevels( host ) host 由網址取得的主機名稱。此 Function 會 return host 的 Domain 層數(點的數目)。 |
shExpMatch | shExpMatch( str, shexp )str 要進行比對的字符串。shexp 比對的條件。此 Function 會比對 str 是否符合 shexp 的表示式(此表示式為 shell expression 而非 regular expressions)。如果是,則 return true;否則 return false。 |
weekdayRange | |
dateRange | |
timeRange |
本人使用的翻牆軟件就是使用PAC,看截圖效果
參考資料:http://findproxyforurl.com/pac-functions/
如何使用shadowsocks翻牆,可以查看另一篇文章,免費翻牆利器:shadowsocks
原文地址: PAC 自動代理
標簽: pac http proxy shadowsocks socks socks5