总有一些美好,期待着我们去发现
RSS 图标 Email 图标 首页图标
  • PAC-通用跨设备的智能“跨栏”法

    发表于 2011年01月23日 黄良懿 2 条评论




    作为一个身在天朝的资深互联网从业者或是使用者,有一项众所周知的运动是难免要参与的。由于是全民健身运动的重要组成部分,网上自然遍地大把大把的各类跨栏方法,VPN、HTTP TUNNEL、Tor、Auto Proxy等等五花八门,各有各的特点。不过作为一个重度的Geek,我有跨栏需求的上网设备包括Windows、Linux Server、iPhone、Windows Mobile等十件上下,一一搞下来还是有些小蛋疼的。 虽然不折腾就会死,但真的往死里折腾还是能免则免了。

    总的来说,需求无非就是要让一些会一头撞死在墙上的访问(非死不可之类,你肯定懂的)去到一个有门或者有窗又或者有戏的地方,从而正常的过去,让那些本来就和谐美满的访问各找各妈。而且不出意外的话,这些访问基本上十有八九都是http或者https。于是就想起一个很久很久以前就存在的东西——PAC。

    PAC是Proxy Auto Config的简写,主流的浏览器和上网设备都支持,通过一个JavaScript语法的脚本,PAC能根据你访问的URL决定这个请求是走http代理、socks代理或是直接请求。所以,使用的前提是你必须有一个有门或者有窗又或者有戏的地方(赞美Whygod师弟,赞助了海外SSH帐号一枚),没有的同学还请先找你们的自由门或者无界什么的。另外一个相对简单些,特别是对技术宅们来说简单得多的需求,就是有一个能发布完整文件的地方(能上传文件并且无需登录就可以打开的就好)。PAC在这里的作用主要在于实现不同的请求策略,类似于AutoProxy,但这个是在Web上放置的,对任意设备、任意浏览器来说,只需指定PAC文件的url就可以了,不需要考虑其他浏览器上有没有AutoProxy,要不要同步设置。

    好了,废话说完,上代码:

    function FindProxyForURL(url, host) {
    	var proxyDomains = [
    		"facebook.com",
    		"fbcdn.net",
    		"twitter.com",
    	];
    	for (var i = 0; i < proxyDomains.length; i++) {
    		if (dnsDomainIs(host, proxyDomains[i])) {
    			return "SOCKS5 a.b.c.d:p";
    		}
    	}
    	return "DIRECT";
    }

    其中可以根据需要修改的地方有:

    • a.b.c.d和p,应为你的有门或者有窗又或者有戏的地方。
    • proxyDomains里可以增加其他的域名后缀如appspot等。
    • return的代理如果是HTTP类型的,则应将SOCKS5替换为PROXY。
    • 如果在代理不可用的情况下,还是要走直接访问,或者是有备用代理,可以这样改:return "PROXY a.b.c.d:p; SOCKS a.b.c.d2:p2; DIRECT"; 。

    更多的PAC语法,可以自行Google。

     

    Update [2011-02-12]:

    如果所在地区存在DNS污染,可以通过启用Remote DNS来解决。

    Firefox下,由于Remote DNS性能一般较差,并非默认开启,需要打开about:config,并在过滤器中输入network.proxy.socks_remote_dns,双击将其设置为True。

    Chrome可以通过插件来开启这个,IE就没办法了。

    最后贴几张图,IE、Firefox、iPhone/iPod的设置方法(最后一张图来自www.jejer.net):

    IE下的PAC代理设置

    Firefox下的PAC代理设置

    iPhone/iPod下的PAC代理设置

    相关日志:


    相关日志:

     

    2 responses to “PAC-通用跨设备的智能“跨栏”法” RSS 图标