代理自动配置

代理自动配置（，简称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 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. 

網頁瀏覽器
代理伺服器