最近看了 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
