本文主要讨论的是浏览器代理服务器设置技术,文中出现的人名、公司名或者域名均为化名,如有雷同,纯属巧合。
在某些地方上网时,比如南京大学的校园网中,某些公司的局域网中,我们可能需要用到代理服务器。代理服务器的切换一直是一个让人头痛的话题,IE 浏览器有一个 ProxySwither Lite 软件可以用来切换代理,Firefox 有一批插件可以用来切换代理,但是,很难用它们来解决全局性的问题,使用前的配置也是比较麻烦的事情。那么,有没有一种方法可以一劳永逸地解决这个问题呢?答案是有的,那就是 PAC(Proxy Auto-Config) 文件。
使用 PAC 文件我们可以做到:1. IE、Firefox、Opera...浏览器使用同一个代理配置方案,Windows、Linux多系统使用同一个代理配置方案;2. 针对特定的域名,使用特定的代理;3. 针对特定的 IP 范围,使用特定的代理;4. 针对特定的 URL 模式,使用特定的代理。
下面我们来看一个案例:
假设小明的电脑位于 C 公司的局域网中,C 公司为了某些需要禁止员工访问某些站点,例如: alogspot.com 和 bwitter.com ,但是小明的工作和学习需要经常访问这些站点,公司的网管给小明带来了很大不便。不过小明很聪明,他找到了一个可以访问被禁那些站点的一个代理 127.0.0.1:8000。虽然通过该代理小明可以访问这些站点,但是切换代理和浏览器设置始终是麻烦;特别是在用 doogle.com 搜索到的某些文章位于 alogspot.com 时,一不小心点了搜索结果,到搜索引擎 doogle.com 的连接就会有很大一会儿被重置。因为小明的代理速度比较慢,总不能用代理上所有网站吧?这真是件麻烦事,小明该怎么办呢?
虽然很头痛,但是互联网的开拓者们给我们留下了那么多遗产,怎么能不好好利用呢?小明翻出了一个尘封已久的 Wiki 页面,缓缓回忆起那古老的 Javascript 语言,顿时有了主意,于是他写出了下面这个 PAC 脚本:
// 看看域名是不是本地站点
function isLocalHost(host)
{
if( dnsDomainIs(host, "localhost") )
return true;
return false;
}
// 看看域名是不是禁止访问的站点
function isBlockedHost(host)
{
if( dnsDomainIs(host, "alogspot.com") ||
dnsDomainIs(host, "bwitter.com") )
return true;
return false;
}
// 看看搜索结果 URL 中是不是包含被禁止访问的关键字
function isBlockedURL(url, host)
{
if( dnsDomainIs(host, "doogle.com") ) {
if ( shExpMatch(url, "*alogspot.com*") ||
shExpMatch(url, "*bwitter.com*") )
return true;
}
return false;
}
// 看看 IP 在不在本地 IP 范围内
function isLocalIP(addr)
{
if( isInNet(addr,"127.0.0.0","255.0.0.0") ||
isInNet(addr,"10.0.0.0","255.0.0.0") ||
isInNet(addr,"192.168.0.0","255.255.0.0") ||
isInNet(addr,"172.16.0.0","255.255.0.0") )
return true;
return false;
}
// 看看 IP 在不在被禁止访问的 IP 范围内
function isBlockedIP(addr)
{
return false;
}
// 看看 IP 地址是不是 IPv6 地址
function isIPV6(addr)
{
if( shExpMatch(addr, "*:*") )
return true;
return false;
}
// 这是浏览器默认调用的函数接口
function FindProxyForURL(url, host)
{
var direct = "DIRECT";
var httpProxy = "PROXY localhost:8000";
var socksProxy = "SOCKS localhost:9050"; // 留着做个参考
if(isLocalHost(host)) {
// 如果是本地域名,那就直连
return direct;
} else if(isBlockedURL(url, host) || isBlockedHost(host)) {
// 如果是被禁止访问的域名,或者搜索结果 URL 中含有被禁止访问的关键词,那就走代理
return httpProxy;
}if(!isResolvable(host)) {
// 如果域名不能解析,那就直连
return direct;
}
// 解析域名到 IP 地址
var IpAddr = dnsResolve(host);if(isLocalIP(IpAddr) || isIPV6(IpAddr)) {
// 如果是本地 IP 或者 IPv6 地址,那就直连
return direct;
} else if(isBlockedIP(IpAddr)) {
// 如果是被禁止访问的地址,那就走代理
return httpProxy;
} else {
// 剩下的,唉,就直连吧
return direct;
}
}
小明将以上内容保存为 C:proxy.pac(~/proxy.pac),然后到
Firefox 中,选择 工具->选项->高级->网络->设置(Edit->Preferences->Advanced->Network->Settings),将 file:///c:/proxy.pac(file:///home/username/proxy.pac)填入“自动代理配置 URL”(Automatic proxy configuration URL)文本框中;
再到
IE 中,选择 工具->Internet 选项->连接->局域网设置,勾选使用自动配置脚本,填入 file://c:/proxy.pac;
再到
Opera 中,选择 Tools->Preferences->Advanced->Network->Proxy Servers,勾选上 Use automatic proxy configuration,填入 file://c:/proxy.pac。
从此,小明就开始了自己幸福的互联网冲浪生活,再也没有看到那曾经熟悉的“到该网站的连接已被重置”消息了。
PS:若要 Firefox 和 Chrome 支持远端 DNS 解析,需使用 SOCKS5 作为代理的前缀。
有好东西也不知道给我弄好(凶)
很多公司为了根据不同部门进行网络限制,就经常会用到pac。
这个东西是完全的一劳永逸。
什么代理上google的服务最快, 特别是gmail. 我不知道怎么找代理....
@NjuBee
我也不知道,Google 服务的安全性很强,所以要求代理至少支持 HTTPS 连接,而我经常用的 GAppProxy 理论上也是 Google 的服务,所以如果 Google 不能访问,那我也只能忍受 Tor 的蚁速了。
很强大,建议LZ以后编写,最好也提供一个完成品,这样可以方便很多纯小白和伸手党-_-|||,虽然已经很详细了。
@YYUU
不是没有完成品,是不能提供完成品呀...
pac还是很痛苦的 ms ie和firefox的不完全一样
@lirui0073
据我所知,仅仅是本地文件 url 不完全一样而已,在文中也写明了 url 的写法。
博主 为何python 2.6能支持gappproxy https浏览,而python 2.5却不支持。按照你的方法,是否实现在2.5能使用https ,能否开释下?