Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

[GFW BLOG] PAC自动代理文件格式,教你如何写PAC文件

15 views
Skip to first unread message

RSS Feed For GFW BLOG

unread,
Jan 13, 2011, 9:02:00 AM1/13/11
to
来源:[http://www.truevue.org/javascript/pac-format][1]

[1]: http://www.truevue.org/javascript/pac-format

PAC文件格式

PAC文件是纯文本格式的,实际上就是JavaScript文件。Chrome/Chromium的扩展Switchy!的"Auto Switch Mode"功能实际上也是创建和维护一个简单的PAC文件,但功能比较弱。

对于一般的应用,即使你几乎不懂JavaScript和编程,也可以通过本文的介绍实现基本的功能。

PAC文件FindProxyForURL函数

PAC文件中必须包含一个函数:FindProxyForURL(url, host)。

参数url是用户输入的url,参数host是url中的主机名。

比如url为[http://www.truevue.org/javascript/pac-proxy-setting][2],那么host就是[www.truevue.org][3]

[2]: http://www.truevue.org/javascript/pac-proxy-setting

[3]: http://www.truevue.org

一个最简单的PAC文件内容如下:


function FindProxyForURL(url, host) {

return "DIRECT";

}

这个PAC文件实际上什么也没做,对任何URL,都将"DIRECT"(直接连网)。

PAC文件返回值类型

除了可以return "DIRECT"以外,还有两种常用方式:

PROXY [proxysample.com:8080][4]

[4]: http://proxysample.com:8080

http代理的主机和端口,主机也可以用IP表示

SOCKS5 [socks5sample.com:1080][5]

[5]: http://socks5sample.com:1080

socks5代理的主机和端口,主机也可以用IP表示

那么,我们可以猜测到,用pac指定一个http代理应该这样写


function FindProxyForURL(url, host) {

return "PROXY [192.168.1.1:3128][6]";

}

[6]: http://192.168.1.1:3128

甚至可以指定多个代理 ` `


function FindProxyForURL(url, host) {

return "DIRECT; PROXY [192.168.1.1:3128][7]; SOCKS5 [lilinux.net:1080][8]";

}

[7]: http://192.168.1.1:3128

[8]: http://lilinux.net:1080

这句语句的意思是:

1. 对所有URL,都直接连接;

2. 如果不能直接连接,那么就使用[192.168.1.1:3128][9]这个http代理连接;

3. 如果还是不能连接,则使用[lilinux.net:1080][10]这个socks5代理连接。

[9]: http://192.168.1.1:3128

[10]: http://lilinux.net:1080

使用不同连接的顺序和语句中的顺序一致,你可以根据自己的实际情况更改。

也许你明确知道哪些网站不能直连,必须用PROXY或者SOCKS5连接,那么可以对站点分别指定代理配置


function FindProxyForURL(url, host) {

if (shExpMatch(url,"*.[google.com/*][11]")) {

return "PROXY [192.168.1.1:3128][12]";

}

if (shExpMatch(url, "*.wikipedia.com:*/*")) {

return "SOCKS5 [lilinux.net:1080][13]";

}

if (isInNet(host, "10.0.0.0", "255.0.0.0")){

return "DIRECT";

}

return "DIRECT; PROXY [192.168.1.1:3128][12]; SOCKS5 [lilinux.net:1080][13]";

}

[11]: http://google.com/*

[12]: http://192.168.1.1:3128

[13]: http://lilinux.net:1080

这个PAC文件中引入了两个新的函数,但从字面意思上,我们也可以猜出代码的大概意思:

1. 当url是*.[google.com/*][14] 时,自动使用PROXY代理;

2. 当url是*.[wikipedia.cm/*][15]时,自动使用SOCKS5代理;

3. 当host是10.0.0.0 /[255.0.0.0][16]的子网内时,自动直连;

4. 如果都不匹配,则依次按DIRECT、PROXY、SOCKS5的次序尝试。

[14]: http://google.com/*

[15]: http://wikipedia.cm/*

[16]: http://255.0.0.0

shExpMatch函数用来匹配url或者host,匹配的方式和DOS的通配符相似。例如前面用到的"*.[google.com/*][17]"可以匹配任意包含".[google.com/][18]"的字符串。

[17]: http://google.com/*

[18]: http://google.com/

Chrome/Chromium 的扩展Switchy!创建的pac文件还自定义了一个函数,可以用来匹配正则表达式,不过个人认为在url匹配上通常不需要使用强大的正则表达式。

isInNet函数用来返回请求的host是否在指定的域内。值得注意的是,isInNet的第二个参数必须是 IP,不能是主机名。因此需要把主机名转换成IP。比如"isInNet(host, dnsResolve([www.google.com][19]),
"255.255.255.0")"讲到这里,应该可以解决你的问题了吧。

[19]: http://www.google.com/ (www.google.com)

PAC文件可以使用的JavaScript函数

当然PAC也不止这么简单,它还提供了不少其它函数,在本文就不详细讲述了。[http://www.truevue.org/javascript/pac-functions][20] 中列出了PAC代理文件中可以使用的JavaScript函数。

[20]: http://www.truevue.org/javascript/pac-functions

你也许想把pac文件发布到Internet上,这样其它用户就只需要在浏览器中指定pac文件的url即可。你得配置你的服务器映射 .pac 文件后缀到MIME类型: application/x-ns-proxy-autoconfig 如果使用的是Netscape服务器,编辑 config 目录下的
mime.types 文 件。如果是Apache, CERN or NCSA服务器,使用 AddType 指令。


敬请订阅中国数字时代中文版(http://chinadigitaltimes.net/chinese/feed),阅读最有价值的中文信息。下载TOR等翻墙软件,请访问Sesawe(http://fanqianggongju.info/)。需翻墙?请发电邮(最好用Gmail)到:CDTcaonima@
gmail.com。GFW Blog订阅地址:http://feeds2.feedburner.com/chinagfwblog![][21]

[21]: https://blogger.googleusercontent.com/tracker/5500297126185736776-2602972133932964663?l=www.chinagfw.org

![][22]

[22]: http://feeds.feedburner.com/~r/chinagfwblog/~4/U6erCGyTFc8

Contentes HTML URL: http://feedproxy.google.com/~r/chinagfwblog/~3/U6erCGyTFc8/pacpac.html

Send By Feed RSS2eMail BOT V2.65
Admin By Liuxing99

0 new messages