PAC小提示,顺便推Firefox

避免使用——

return “SOCKS 127.0.0.1:8001; DIRECT”;

这个设定看起来很美,SOCKS挂了的话选择DIRECT模式继续。然而实际情况是怎样?若存在多个选项(例子是SOCKS和DIRECT),对SOCKS是否响应的测试,WinINET库只会做一次(若有Load Balancing功能,对代理的选择应是RR)。也就是说,一旦前面的SOCKS端口关闭,所有请求均使用DIRECT模式。即便再启动端口,请求也不会走SOCKS(直到程序重启)。除非你能保证SOCKS 100%响应,否则别加入DIRECT为后备选项(单独return可以)。

另外,Google Chrome对File://协议的支持依旧是浮云,如果你使用本地PAC文件(Chrome使用IE的设置),会出现在IE中没问题,Chrome却不读取PAC的状况。Opera 10读取本地PAC文件亦有问题,至少我没成功过。

最后,WinINET不支持SOCKSv5,这代表着它不支持UDP层查询DNS的功能,修改HOSTS表或把Lookup请求用软件Forward到SOCKS端口上才可实现远程DNS查询。更诡异的是,Chromium的人知道WinINET的弱点之后,自己开发了一个独立的HTTP stack,支持SOCKSv5,却没有实现UDP层,于是也不支持DNS查询。前后不是人。

如果你真的很在意SOCKS,延展性极强的Firefox依旧是你最好的选择。以上。

更新:Chrome需要用Flag来设置,Lookup如前文所述,依旧提交至本地设置的DNS(IE默认),而非远程。h/t to est.

Author: 店长

The Master of BitInn

15 thoughts on “PAC小提示,顺便推Firefox”

  1. 我是file:///home/wjzhou/work/proxy.pac。
    似乎有时候改了文件要重启ff才行。
    而且,对于twitter来说,要同时在hosts里指定twitter ip才行,不知道为什么。

    function FindProxyForURL(url, host) {
    url = url.toLowerCase(); // Twitter必需
    if (
    /////////////////////////////////////////////////
    shExpMatch(url, ‘*twitter.com*’) ||
    shExpMatch(url, ‘*twimg.com*’) ||
    shExpMatch(url, ‘*youtube.com*’) ||
    shExpMatch(url, ‘*ytimg.com*’) ||
    shExpMatch(url, ‘*wordpress.com*’) ||
    shExpMatch(url, ‘*facebook.com*’) ||
    shExpMatch(url, ‘*blogspot.com*’) ||
    /////////////////////////////////////////////////
    false) { return ‘SOCKS 127.0.0.1:7777’; }
    return ‘DIRECT’;
    }

    1. DNS Lookup的问题,墙对推特的劫持比较全面。
      不想改Hosts的话,只能想办法把这些DNS查询转发到SOCKS上。

      完全支持SOCKSv5的浏览器可以用UDP层绕过。

  2. autoproxy在未来有希望变成一个整合性平台,做到专门化privoxy的程度,路由优化、DNS本地缓存、代理平衡一并解决了。

  3. function FindProxyForURL(url, host) {

    var DIRECT = 0, AD_FILTER = 1, TOR = 2, TOR_SOCKS = 3,
    GFW = TOR,
    proxy = [
    ‘DIRECT’, // 0 DIRECT
    ‘PROXY 0.0.0.0:80’, // 1 AD_FILTER
    ‘PROXY 127.0.0.1:8118’, // 2 TOR
    ‘SOCKS 127.0.0.1:9050’ // 3 TOR_SOCKS
    ],
    hosts = {
    ‘127.0.0.1’ : DIRECT,
    ‘localhost’ : DIRECT,
    ‘blogspot.com’ : GFW,
    ‘tumblr.com’ : GFW,
    ‘twitter.com’ : GFW,
    ‘getchu.com’ : GFW,
    ‘gstatic.com’ : GFW,
    // and so on…
    ‘images.google.com’ : GFW,
    ‘mail-archive.com’ : GFW,
    ‘wikileaks.org’ : GFW,
    ‘my.opera.com’ : GFW,
    ‘youtube.com’ : GFW
    },
    urls = {
    },
    subnets = [],
    i, ilen, j, jlen, ret;

    ret = proxy[DIRECT];

    if( isPlainHostName(host) ) {
    return ret;
    }

    url = url.toLowerCase();
    host = host.toLowerCase();

    for(i in hosts) {
    if( dnsDomainIs(host, i) ) {
    ret = proxy[hosts[i]];
    break;
    }
    }

    return ret;
    };
    // 一旦脚本语法有误,即使纠正也必须重启Opera。

    1. PAC没问题,问题在于输入的本地位置。

      file://..
      file:///..
      file://localhost/..

      全部不行。

      PS:你的for-loop会比较慢的样子。

      1. 位置:D:\others\proxy.pac 没有file:\/+
        …for loop感觉不出来就算了,我网速慢多了…

Comments are closed.