代理自動組態
代理自動組態(英語:Proxy auto-config,簡稱PAC)是一種網頁瀏覽器技術,用於定義瀏覽器該如何自動選擇適當的代理伺服器來訪問一個網址。
一個PAC檔案包含一個JavaScript的函數「FindProxyForURL(url, host)」,這個函數返回一個包含一個或多個訪問規則的字串。用戶代理根據這些規則使用一個特定的代理器或者直接訪問,這些規則也有優先級。當使用高優先級的規則無法訪問的時候,低優先級的訪問規則(如果存在)就提供了備用的訪問方式。瀏覽器在訪問網頁以前,會首先訪問這個PAC檔案。PAC檔案中的URL可能是手工組態的,也可能是是通過網頁的網絡代理自動發現協定自動組態的。
相關技術
[編輯]現代瀏覽器實現了多種級別的代理設置,用戶可以選擇最適合他們需要的級別。下面是三種常用的設置:
- 手動代理組態/全域模式:為所有的URLs規定一個主機名和埠作為代理。大多數瀏覽器允許用戶規定一個域名的列表(例如localhost),訪問這個列表裏面的域名的時候不通過代理伺服器。
- 代理自動組態(PAC):規定一個指向PAC檔案的URL,這個檔案中包括一個選擇代理伺服器的JavaScript程式。這個方法適合複雜設置,例如需要針對不同網址組態不同的代理伺服器,或者指定某些網站使用或不使用代理伺服器。
- 網絡代理自發現協定:瀏覽器通過DHCP和DNS來搜尋PAC檔案。
PAC檔案
[編輯]要使用PAC,應當在一個網頁伺服器上發佈一個PAC檔案,並且通過在瀏覽器的代理連結設置頁面輸入這個PAC檔案的URL或者通過使用網絡代理自動發現協定告知用戶代理去使用這個檔案。
一個PAC檔案是一個至少定義了一個JavaScript函數的文字檔案。這個函數「FindProxyForURL(url, host)「有2個參數:url是一個對象的URL,host是一個由這個URL所衍生的主機名。按照慣例,這個檔案名字一般是proxy.pac. 網絡代理自動發現協定標準使用wpad.dat。
雖然現代的大多數客戶端無論從HTTP請求返回的MIME類型是什麼都能正確處理,但為了完整性和最佳的相容性,我們應該設置網頁伺服器將這個檔案的MIME類型聲明為application/x-ns-proxy-autoconfig或者application/x-javascript-config。(application/x-ns-proxy-autoconfig相對application/x-javascript-config被更多的客戶端所支援,因為它是最初被定義在Netscape規範裏面的,而後者最近才開始被使用。)
一個非常簡單的PAC檔案內容
function FindProxyForURL(url, host) { return "PROXY proxy.example.com:8080; DIRECT"; }
這個函數告知瀏覽器通過伺服器proxy.example.com的8080埠來取得所有的頁面。如果這個伺服器沒有反應,那麼瀏覽器應該不使用代理伺服器直接訪問WWW. 下面是一個更加複雜一些的例子,展示了在FindProxyForURL函數中如何使用JavaScript函數:
function FindProxyForURL(url, host) {
// our local URLs from the domains below example.com don't need a proxy:
if (shExpMatch(url,"*.example.com/*")) {return "DIRECT";}
if (shExpMatch(url, "*.example.com:*/*")) {return "DIRECT";}
// URLs within this network are accessed through
// port 8080 on fastproxy.example.com:
if (isInNet(host, "10.0.0.0", "255.255.248.0")) {
return "PROXY fastproxy.example.com:8080";
}
// All other requests go through port 8080 of proxy.example.com.
// should that fail to respond, go directly to the WWW:
return "PROXY proxy.example.com:8080; DIRECT";
}
局限
[編輯]PAC檔案編碼
[編輯]有些瀏覽器,例如Internet Explorer只支援系統預設編碼的PAC檔案,不支援Unicode編碼的PAC檔案,例如UTF-8編碼的PAC檔案。
DnsResolve
[編輯]函數dnsResolv(及其他類似函數)在執行DNS查詢時,如果DNS伺服器沒有回應,會導致你的瀏覽器被阻塞很長時間。 Microsoft的IE5.5或更高版本瀏覽器提供的基於域名的代理自動組態快取機制限制了PAC標準的靈活性。實際上,你是通過域名來選擇代理伺服器,而不是通過URL路徑。當然,你可以通過修改登錄檔的方法來關閉代理自動組態的快取,Royne Pollard描述了這個步驟(詳見深入閱讀)。
為了相容Windows中其他使用Internet Explorer PAC設置的組件,例如.NET 2.0框架,推薦在isInNet函數中使用IP位址而不是域名。
if (isInNet(host, dnsResolve(sampledomain) , "255.255.248.0") // .NET 2.0 will resolve proxy properly
if (isInNet(host, sampledomain, "255.255.248.0") // .NET 2.0 will not resolve proxy properly
當一個PAC規則不可用的時候,當前預設採用的方法是直接連接。
其他的限制與本地的JavaScript有關。
其他功能
[編輯]有些更進階的PAC檔案可以使用負載平衡、故障轉移甚至黑白名單等方法減少對於使用的代理伺服器的負載。並且可以返回多個代理伺服器,例如:
return "PROXY proxy1.example.com:8080; PROXY proxy2.example.com:8080";
參考資料
[編輯]de Boyne Pollard, Jonathan. Automatic proxy HTTP server configuration in web browsers. Frequently Given Answers. 2004 [2016-08-12]. (原始內容存檔於2012-04-23).
外部連結
[編輯]- Navigator Proxy Auto-Config File Format (from the Release Notes for Netscape Navigator 2.0)
- Using the Client Autoconfiguration File (Chapter 11 of Netscape Proxy Server Administrator's Guide, version 3.5 for Unix)
- Description of proxy auto-configuration files from Microsoft
- ReturnProxy.com - The Practical Proxy PAC File Guide and Forums
- PAC File & WPAD Examples(頁面存檔備份,存於互聯網檔案館)
- pacparser(頁面存檔備份,存於互聯網檔案館) C and Python library to parse PAC files.
- Pactester(頁面存檔備份,存於互聯網檔案館) A tool to test PAC files.
- A web front-end for the Google PAC Tester(頁面存檔備份,存於互聯網檔案館)
- proxyvalidator Test all destination proxies within a PAC file.
- PAC-file to filter bad hosts and pornography(頁面存檔備份,存於互聯網檔案館)
- Proxy Auto Config "how to". Fully working examples including anti-ad and anti-adult filter rules.