浏览器自动代理设置PAC脚本编写功能介绍
laoyan 2016-07-12 16:31:29
分 享

PAC脚本简介


PAC文件是纯文本格式的,实际上就是JavaScript文件。PAC最简单的格式就是包含一个叫FindProxyForURL的JavaScript函数,IE通过传入两个变量来调用这个函数。一个是用户流量的地址的URL全路径,一个是这个URL中的主机名host。在日常生活中浏览器中设置代理很简单,但是当你来回切换时总是觉得很烦,你可以使用pac脚本自动判断是否走代理,方便省去了来回手动切换的烦恼。


PAC脚本语法


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

参数url是用户输入的url

参数host是url中的主机名

例子:url为http://www.lybbn.cn/proxy-pac,那么host就是www.lybbn.cn


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


function FindProxyForURL(url,host){
    return "DIRECT";
}


此PAC文件的作用是对于任何的URL都进行“DIRECT”直接上网不通过代理


PAC文件返回值有三种类型


(1)DIRECT 直连不通过代理
(2)PROXY www.lybbn.cn:8080 http通过8080端口代理上网,也可以使用ip:port的形式
(3)SOCKS5 www.lybbn.cn:8080 socks通过8080端口代理上网,可以使用ip:port形式


说明:PAC文件区分大小写,文件要用系统默认编码保存,比如ansi,不能为utf8格式,文件写好后,IE的菜单里"工具"->"INTEL选项"->"连接"->局域网代理设置中填写PAC文件的路径,路径


格式为:file://c:/proxy.pac


pac脚本IE浏览器file本地填写格式.png


要使设置生效,需要关闭IE再重新打开。如果你的pac文件放置在互联网上,且放在http服务器上,则可写成http://www.lybbn.cn/proxy.pac


pac脚本IE浏览器http网络填写格式.png


PAC脚本案例


(1)本地地址直连连接上网不走代理,其他地址走HTTP代理上网


使用isPlainHostName(host)判断是否为本机地址,是本机地址返回True


function FindProxyForURL(url, host)
{
    if (isPlainHostName(host)){
      return "DIRECT";
    }
    else{
      return "PROXY www.lybbn.cn:8080";
    }
}
或者
function FindProxyForURL(url, host)
{
    if (host=="http://lybbnlocal.com"){
      return "DIRECT";
    }
    else{
      return "PROXY www.lybbn.cn:8080";
    }
}


(2)指定一些网站必须使用代理,一些地址不能使用代理


function FindProxyForURL(url, host)
{
    if(shExpMatch(url,"*.google.com/*")){
return "PROXY 172.16.0.11:8080";
    }
    if(shExpMatch(url,"*.qq.com/*")){
    return "SOCKS5 172.16.0.11:3128";
    }
    if(isInNet(host, "10.0.0.0",  "255.0.0.0")){
    return "DIRECT";
    }
    return "DIRECT;PROXY 172.16.0.11:8080;SOCKS5 172.16.0.11:3128";
}


当url是*.google.com/* 时,自动使用PROXY代理;当url是*.qq.com/*时,自动使用SOCKS5代理;当host是10.0.0.0 /255.0.0.0的子网内时,自动直连;如果都不匹配,则依次按DIRECT、PROXY、SOCKS5的次序尝试。


函数解释:


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

2.isInNet函数用来返回请求的host是否在指定的域内。值得注意的是,isInNet的第二个参数必须是 IP,不能是主机名。因此需要把主机名转换成IP。比如"isInNet(host, dnsResolve(www.google.com), "255.255.255.0")"

3.dnsResolve函数是把域名解析成ip地址



(3)如果我本机地址是192.168.1.1的时候,就走http代理上网,不是就走直连上网(适合家里和公司办公自动切换场景)


function FindProxyForURL(url, host)
  {
      if (myIpAddress() == "192.168.1.1") { 
        return "PROXY www.lybbn.cn:80";
      }
      else {
        return "DIRECT";
      }
  }


myIpAddress()获取本机的地址



(4)自己有多个代理的时候随机使用代理服务器上网


function FindProxyForURL(url,host)
{
      return randomProxy();
}
function randomProxy()
{
     switch( Math.floor( Math.random() * 3 ) )
     {
         case 0:
             return "PROXY www.lybbn1.cn:8080";
             break;
         case 1:
             return "PROXY www.lybbn2.cn:8080"; 
             break;
         case 2:
             return "PROXY www.lybbn3.cn:8080";
             break;
     }    
}


本文属原创文章,转载请注明来自Lybbn(lybbn.cn)

我要小额支持下

取消

感谢您的支持,我会继续努力的!

扫码支持
扫码打赏,你说多少就多少

打开支付宝扫一扫,即可进行扫码打赏哦

取消
吐槽一下

游客

所有吐槽
  • 暂时还没有吐槽,赶紧来吐槽!