PAC文件格式
PAC文件是純文本格式的,實際上就是JavaScript文件。Chrome/Chromium的擴展Switchy!的"Auto Switch Mode"功能實際上也是創建和維護一個簡單的PAC文件,但功能比較弱。
對於一般的應用,即使你幾乎不懂JavaScript和編程,也可以通過本文的介紹實現基本的功能。
PAC文件FindProxyForURL函數
PAC文件中必須包含一個函數:FindProxyForURL(url, host)。
參數url是用戶輸入的url,參數host是url中的主機名。
比如url為http://www.truevue.org/javascript/pac-proxy-setting,那么host就是www.truevue.org
一個最簡單的PAC文件內容如下:
function FindProxyForURL(url, host) { return "DIRECT"; }
這個PAC文件實際上什么也沒做,對任何URL,都將"DIRECT"(直接連網)。
PAC文件返回值類型
除了可以return "DIRECT"以外,還有兩種常用方式:
PROXY proxysample.com:8080
http代理的主機和端口,主機也可以用IP表示
SOCKS5 socks5sample.com:1080
socks5代理的主機和端口,主機也可以用IP表示
那么,我們可以猜測到,用pac指定一個http代理應該這樣寫
function FindProxyForURL(url, host) { return "PROXY 192.168.1.1:3128"; }
甚至可以指定多個代理
function FindProxyForURL(url, host) { return "DIRECT; PROXY 192.168.1.1:3128; SOCKS5 lilinux.net:1080"; }
這句語句的意思是:
- 對所有URL,都直接連接;
- 如果不能直接連接,那么就使用192.168.1.1:3128這個http代理連接;
- 如果還是不能連接,則使用lilinux.net:1080這個socks5代理連接。
使用不同連接的順序和語句中的順序一致,你可以根據自己的實際情況更改。
也許你明確知道哪些網站不能直連,必須用PROXY或者SOCKS5連接,那么可以對站點分別指定代理配置
function FindProxyForURL(url, host) { if (shExpMatch(url,"*.google.com/*")) { return "PROXY 192.168.1.1:3128"; } if (shExpMatch(url, "*.wikipedia.com:*/*")) { return "SOCKS5 lilinux.net:1080"; } if (isInNet(host, "10.0.0.0", "255.0.0.0")){ return "DIRECT"; } return "DIRECT; PROXY 192.168.1.1:3128; SOCKS5 lilinux.net:1080"; }
這個PAC文件中引入了兩個新的函數,但從字面意思上,我們也可以猜出代碼的大概意思:
- 當url是*.google.com/* 時,自動使用PROXY代理;
- 當url是*.wikipedia.cm/*時,自動使用SOCKS5代理;
- 當host是10.0.0.0 /255.0.0.0的子網內時,自動直連;
- 如果都不匹配,則依次按DIRECT、PROXY、SOCKS5的次序嘗試。
shExpMatch函數用來匹配url或者host,匹配的方式和DOS的通配符相似。例如前面用到的"*.google.com/*"可以匹配任意包含".google.com/"的字符串。
Chrome/Chromium 的擴展Switchy!創建的pac文件還自定義了一個函數,可以用來匹配正則表達式,不過個人認為在url匹配上通常不需要使用強大的正則表達式。
isInNet函數用來返回請求的host是否在指定的域內。值得注意的是,isInNet的第二個參數必須是 IP,不能是主機名。因此需要把主機名轉換成IP。比如"isInNet(host, dnsResolve(www.google.com), "255.255.255.0")"講到這里,應該可以解決你的問題了吧。
PAC文件可以使用的JavaScript函數
當然PAC也不止這么簡單,它還提供了不少其它函數,在本文就不詳細講述了。http://www.truevue.org/javascript/pac-functions 中列出了PAC代理文件中可以使用的JavaScript函數。
你也許想把pac文件發布到Internet上,這樣其它用戶就只需要在瀏覽器中指定pac文件的url即可。你得配置你的服務器映射 .pac 文件后綴到MIME類型: application/x-ns-proxy-autoconfig 如果使用的是Netscape服務器,編輯 config 目錄下的 mime.types 文 件。如果是Apache, CERN or NCSA服務器,使用 AddType 指令。