加载中…
个人资料
  • 博客等级:
  • 博客积分:
  • 博客访问:
  • 关注人气:
  • 获赠金笔:0支
  • 赠出金笔:0支
  • 荣誉徽章:
正文 字体大小:

手把手教你写PAC文件(转)

(2011-05-25 16:30:29)
标签:

网络代理

代理文件

it

分类: IT
这篇文章挺好,这里贴出来了:http://blog.lilinux.net/2010/03/proxy-auto-config/

PAC是“Proxy Auto Configure”的简称,即自动代理配置。在为浏览器或系统指定代理时,一般会看到“自动代理配置”的选项。

在“自动配置代理”的输入框中需要输入PAC文件的路径。它可能是在网络上,比如:http://proxyserver/proxy.pac;也可能是在本地,比如:file:///home/lige/pac/proxy.pac 。


比起手动指定代理主机、端口,PAC的好处主要有以下几点:
1. 对不同的站点使用不同的代理配置,加速浏览

2. 配置好之后一劳永逸,不必频繁切换代理

3. 可以为站点配置代理串,如果前面的代理失效,则自动用后面的代理配置

4. 对代理服务器管理员而言,完善的pac文件减少了普通用户的负担


PAC文件是纯文本格式的,实际上就是JavaScript文件。Chrome/Chromium的扩展Switchy!的“Auto Switch Mode“功能实际上也是创建和维护一个简单的PAC文件,但功能比较弱。

对于一般的应用,即使你几乎不懂JavaScript和编程,也可以通过本文的介绍实现基本的功能。

PAC文件中必须包含一个函数:FindProxyForURL(url, host)。参数url是用户输入的url,参数host是url中的主机名。比如url为http://blog.lilinux.net/2010/03/proxy-auto-config/,那么host就是blog.lilinux.net


一个最简单的PAC文件内容如下:

?View Code JAVASCRIPT

 function FindProxyForURL(url, host) { return "DIRECT"; }

这个PAC文件实际上什么也没做,对任何URL,都将“DIRECT”(直接连网)。除了可以return “DIRECT”以外,还有两种常用方式:

PROXY proxysample.com:8080 : http代理的主机和端口,主机也可以用IP表示
SOCKS5 socks5sample.com:1080:socks5代理的主机和端口,主机也可以用IP表示


那么,我们可以猜测到,用pac指定一个http代理应该这样写

?View Code JAVASCRIPT

 function FindProxyForURL(url, host) { return "PROXY 192.168.1.1:3128"; }

 

甚至可以指定多个代理

?View Code JAVASCRIPT

 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连接,那么可以对站点分别指定代理配置

?View Code JAVASCRIPT

 function FindProxyForURL(url, host) {
      if (shExpMatch(url,"*.google.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文件还自定义了一个函数,可以用来匹配正则表达式,不过Li哥个人认为在url匹配上通常不需要使用强大的正则表达式。

isInNet函数用来返回请求的host是否在指定的域内。值得注意的是,isInNet的第二个参数必须是IP,不能是主机名。因此需要把主机名转换成IP。比如“isInNet(host, dnsResolve(www.google.com), “255.255.255.0″)”

待续。。。

 

0

阅读 收藏 喜欢 打印举报/Report
  

新浪BLOG意见反馈留言板 欢迎批评指正

新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 产品答疑

新浪公司 版权所有