本页使用了标题或全文手工转换

代理自动配置

维基百科,自由的百科全书
跳转至: 导航搜索

代理自动配置英语Proxy auto-config,简称PAC)是一种网页浏览器技术,用于定义浏览器该如何自动选择适当的代理服务器来访问一个网址。

一个PAC文件包含一个JavaScript形式的函数“FindProxyForURL(url, host)”。这个函数返回一个包含一个或多个访问规则的字符串。用户代理根据这些规则适用一个特定的代理其或者直接访问。 当一个代理服务器无法响应的时候,多个访问规则提供了其他的后备访问方法。 浏览器在访问其他页面以前,首先访问这个PAC文件。PAC文件中的URL可能是手工配置的,也可能是是通过网页的网络代理自发现协议(Web Proxy Autodiscovery Protocol)自动配置的。

相关技术[编辑]

现代的浏览器实现了几个级别的自动化;用户可以选择最适合他们需要的级别。下面的这些方法被普遍的实现:

  • 手动代理配置:为所有的URLs规定一个主机名和端口作为代理。大多数浏览器允许用户规定一个域名的列表(例如 localhost),访问这个列表里面的域名的时候不通过代理服务器。
  • 代理自动配置(PAC): 规定一个指向PAC文件的URL,这个文件中包括一个JavaScript函数来确定访问每个URL时所选用的合适代理。这个方法更加适合需要几个不同代理配置的笔记本用户,或者有很多不同代理服务器的复杂的企业级设置。这个就是我们在本文中所要讨论的。
  • 网络代理自发现协议(WPAD): 浏览器通过DHCP和DNS的查询来搜索PAC文件的位置。

PAC文件[编辑]

要使用PAC,我们应当在一个网页服务器上发布一个PAC文件,并且通过在浏览器的代理链接设置页面输入这个PAC文件的URL或者通过使用WPAD协议告知用户代理去使用这个文件。

一个PAC文件是一个至少定义了一个JavaScript函数的文本文件。这个函数FindProxyForURL(url, host)有2个参数:url是一个对象的URL,host是一个由这个URL所衍生的主机名。按照惯例,这个文件名字一般是proxy.pac. WPAD标准使用wpad.dat.

虽然大多数客户端无论从HTTP请求返回的MIME类型是什么都能正确处理,但为了完整性和最佳的兼容性,我们应该设置网页服务器将这个文件的MIME类型声明为 application/x-ns-proxy-autoconfig 或者 application/x-javascript-config .

没有什么理由偏爱一种MIME类型多一些,如果有的话,假设 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文件编码[编辑]

有些浏览器,例如Firefox和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";

参考资料[编辑]

Jonathan de Boyne Pollard. Automatic proxy HTTP server configuration in web browsers. Frequently Given Answers. 2004. 

外部链接[编辑]