一波三折的PAC on Mac

Brower

Brower

由于众所周知的原因,看个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上,自然没有问题,唯独就是不利于测试。

三条经验归纳完毕,这不是金科玉律,因为版本等原因,可能会失效,仅供参考。

4 Comments

在MAC翻墙遇到的问题 | 杨先生村民16 9 月, 2011 at 9:22 上午

[…] 127.0.0.1:1080″,而不是SOCKS。规格的说法应该是提供SOCKS。一字之差害死人啊。 […]

Holin24 1 月, 2014 at 7:39 上午

谢谢博主,我改称放远程就可以了。

[…] [1]一波三折的PAC on Mac [2]PAC […]

Rocky25 11 月, 2014 at 10:38 下午

疑似原始文档的PDF版本的连接错了

Leave a comment

Your comment