2011年12月25日星期日

代理自动配置脚本——PAC文件

原文链接http://genghis-yang.tk/?p=86

什么是PAC?

A proxy auto-config (PAC) file defines how web browsers and other user agents can automatically choose the appropriate proxy server (access method) for fetching a given URL.(摘自Wikipedia)

正如这句定义,PAC文件被用来决定某一次网络访问所使用的代理。说得通俗点,就是当你访问某个网站时,由PAC文件判断该不该使用代理,或使用哪一个代理。

为什么会用到PAC?

这有什么用?如果你发问,那你要么不懂网络要么肯定没在大陆待过。在大陆的人都知道GFW,它是互联网上的文字狱,是自由精神的枷锁,是中华名族的樊篱,如果要自由上网就必须“翻墙”。很多翻墙工具都是代理性质的(如Wallproxy、GoAgent等),但是这些代理在访问大陆网站的时候又会增加延迟、拖慢网速。若能在访问被墙网站(如Facebook、Twitter)时通过代理连接,在访问其他网站时直接连接,就能实现既“翻墙”,又不会因代理拖慢其他网站速度。实现这一想法的最便捷方案就是PAC文件。

还有另一部分人(包括我在内),使用中国教育网,只能访问极少一部分大陆网站,不能访任何外国站。这部分人对能够自动配置代理的PAC文件有更强烈的需求。因为教育网要访问外国站就必须加代理,但是通过代理又无法访问教育网网站。如果不能自动配置代理,那么上网过程将会伴随不断的切换代理。而切换代理那繁琐的过程相信没有任何一个人愿意忍受。

如何构造PAC文件?

PAC文件其实可看作是一个JavaScript脚本,只不过它仅支持其中一部分命令。PAC文件必须包含一个FindProxyForURL(url, host)函数,这个函数可以看作是PAC文件的主函数,任何网络访问请求都会由系统传给这个函数。参数url就是要访问的URL,host就是要访问的URL所包含的主机。例如访问http://en.wikipedia.org/wiki/Proxy_auto-config,URL就是它本身,host就是en.wikipedia.org。下面举两个Wikipedia中的例子来说明这个函数的用法:

function FindProxyForURL(url, host) {
return "PROXY proxy.example.com:8080";
}


上面这两句就可以作为一个PAC文件,它对所有URL都返回同一个代理。也就是说这个PAC会让所有访问都通过proxy.example.com:8080这个代理。


下面这个相对复杂一些:


function FindProxyForURL(url, host) {
//对于所有.edu.cn域名,直接连接
if (shExpMatch(url,"*.edu.cn/*")) {return "DIRECT";}
//对于10.0.0.0到10.0.0.255之间的IP地址使用代理
if (isInNet(host, "10.0.0.0", "255.255.255.0")) {
return "PROXY proxy.example.com:8080";
}
//其他网站尝试使用代理访问,代理无效时,直接访问
return "PROXY proxy.example.com:8080; DIRECT";
}


这个例子说明了JavaScript函数在PAC文件中的使用方法。例子中,所有以.edu.cn作为域名的网站都将采用直接连接,所有在10.0.0.0到10.0.0.255之间的网站都会通过代理服务器proxy.example.com的8080端口连接(即使这个代理不可用)。其他一切网络连接都将尝试通过proxy.example.com:8080连接,如果代理无响应则直接连接。关于PAC文件更详尽的格式说明请参考《Navigator Proxy Auto-Config File Format》,如果有兴趣你也可以阅读一些扩展内容《Automatic proxy HTTP server configuration in web browsers》。


有一点不得不提到的是:大多数系统和浏览器只支持ANSI编码的PAC文件,如果使用其他编码(如Unicode)将无法识别。


PAC文件怎么用?


对于Windows系统,直接在“Internet选项”中,“连接”标签,“局域网设置”按钮,选中“使用自动配置脚本”,下面的地址栏填写PAC文件的URL。例如有个auto.pac在你的D盘根目录,则填写“file://d:/auto.pac”;如果这个pac在网络主机上,你就需要填成类似“http://genghis-yang.tk/something/auto.pac”这样。


Windows代理配置图解


对于Firefox浏览器,“首选项”中“高级选项卡”,“网络”标签,“设置”按钮,在“自动代理配置URL”中填入你的PAC。


Firefox代理配置图解


对于Linux系统(以ubuntu10.04为例),在“系统设置”里面打开“网络代理首选项”,在“自动代理配置”中填入PAC的URL。






ubuntu代理配置图解


其他配置方式也很雷同,这里就不赘述了。



请支持我的GoogleCode项目


我在Google Code上开了一个项目——pac-maker,做教育网代理自动配置脚本,包括一个按月更新的PAC文件和一个PAC文件自动生成程序。它主要是为教育网这个特殊群体服务的,主要目的就是让教育网不可访问的IP自动使用代理,而可访问的则直接访问。这个工程刚刚起步,还存在一些问题,期待有人能加入进来,或者提交些Issues,把它做得更好。

1 条评论: