代理自動配置

代理自動配置（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";

**參考資料**

**外部鏈接**
  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 Examplesdate=20201210040800 -  pacparserdate=20150317070448  C and Python library to parse PAC files.-  Pactesterdate=20150404092835  A tool to test PAC files.-  A web front-end for the Google PAC Testerdate=20100901062917 -  proxyvalidator Test all destination proxies within a PAC file.-  PAC-file to filter bad hosts and pornographydate=20100206023339 -  Proxy Auto Config "how to". Fully working examples including anti-ad and anti-adult filter rules.