一波三折的PAC on Mac
由于众所周知的原因,看个facebook也得架个梯子。三年前使用tor,虽然慢,但终究是个不花钱的办法,哪知后来竟然也不能用了。所幸托管网站的服务器开放了ssh,于是采用ssh转发绕过GFW。
起初我使用浏览器的插件来管理网站列表,但是从firefox到chrome,再到safari,插件虽好,但免不了每个浏览器都设置一番,耗时不说,最大的弊端是无法同步,不仅是浏览器之间,还有操作系统之间,–我要周转在Mac OS X (Lion),Debian (Squeeze),Windows (XP)之间。
PAC,全称是Proxy Auto-Config,顾名思义是指代理自动配置,由网景公司在上个世纪提出,无法明白创建者们当时的动机,但肯定不是为了方便P民们翻墙的。这项陈旧的技术达成了我的目的,–把pac文件保存在了Google Code上,将URL设置到操作系统的代理配置里,这样同步问题迎刃而解。
PAC写起来比较简单,懂些JavaScript语法就能调教出适合自己的配置,但是,我并没有找到规格说明的原始出处,只是看到疑似原始文档的PDF版本。
我在配置的过程中,一度遇到比较奇怪的问题,如下:
- Mac OS X系统,PAC在chrome上正常工作,Debian系统,PAC在chrome上却无法工作;
- Mac OS X系统,PAC在chrome上正常工作,在safari无法工作;
- Mac OS X系统,PAC保存在本地,safari无法工作,保存在网络,safari正常工作。
我将处理这些问题的方法归纳如下,以便能帮到其他有类似问题的人。
使用shell表达式,不要正则表达式
PAC提供了一个预定义函数:
shExpMatch(str, shexp) str is any string to compare (e.g. the URL, or the hostname). shexp is a shell expression to compare against. Returns true if the string matches the specified shell expression.
我在写的时候,觉得shExpMatch不太还用,习惯了正则表达式,于是使用
new RegExp(patterns[i]).test(url) |
但是,虽然PAC是用JavaScript来写,但并不说明可以使用其全部的API,PAC提供了少数的预定义函数供开发者使用,却没有说明在此之外的函数能不能被使用,这使得浏览器有了不同的选择,于是同一个平台上,chrome可用,safari不可用。
写做SOCKS,不要写作SOCKS5
这个现象是偶然从一篇博客上看到的:Pac file (proxy) problem with Firefox and Safari running on a Mac OS X,作者提到对于firefox,要写SOCKS5,对于safari,要写SOCKS,否则两个浏览器都无法正常使用PAC。
我在查看PAC规格说明的时候,看到对FindProxyForURL返回值是有约定的,其形式有三,如下:
- DIRECT
- Connections should be made directly, without any proxies.
- PROXY host:port
- The specified proxy should be used.
- SOCKS host:port
- The specified SOCKS server should be used.
也就是说规格说明里,压根不存在SOCKS5。如此看来,这也算是不同浏览器之间的不兼容了。
经过实验,safari不支持SOCKS5,我就在这里耽误了很长的时间,一字之差,结果迥异。
必须请求网络,不能请求本地
在写好了PAC以后,如果把它在电脑上的本地路径设置到代理里,则无法生效,而这在Lion的前一个版本(Snow Leopard)中是没有问题的。在Apple的官方论坛里,有多人提出了这个问题,见Safari 5.1 ignores .pac file。
这个问题的解决之道在于:
Because of the way Lion’s sandboxing mechanism works, having a locally-stored .pac file will not work. Store your .pac on a local server and enter it’s address as “http://www.server.com/pacfile.pac” and it’ll work.
对于我而言,我把.pac文件保存在了Google Code上,自然没有问题,唯独就是不利于测试。
三条经验归纳完毕,这不是金科玉律,因为版本等原因,可能会失效,仅供参考。
[…] 127.0.0.1:1080″,而不是SOCKS。规格的说法应该是提供SOCKS。一字之差害死人啊。 […]
谢谢博主,我改称放远程就可以了。
[…] [1]一波三折的PAC on Mac [2]PAC […]
疑似原始文档的PDF版本的连接错了