当前位置: 首页 > news >正文

PAC (proxy auto-config) 自动代理

代理是个好东西,帮你节省时间,减少麻烦。今天讲一个自动代理文件格式-PAC,它是微软发明的,1999年就提交到了IETF标准化组织,但后来就没有下文了,好在常见的浏览器(Firefox,IE,Safari)都实现了对PAC支持。利用PAC我们可以对某些特定站点或移动到特定的网络时选择特定的代理服务器来浏览网页,这解决了很多时候的不便利。

PAC的语法很简单,下面就是一个例子:

function FindProxyForURL(url, host) {
if (
 shExpMatch(url,"*.mitbbs.com*") ||
 shExpMatch(url,"*.pandora.com*") ||
 shExpMatch(url,"*.popyard.org*") ||
 shExpMatch(url,"*.wordpress.com*") ||
 shExpMatch(url,"*.bullogger.com*")
 )
 {
 return "SOCKS localhost:1080";
 }

 return "DIRECT";
}

把上面的代码保存成一个文本文件,然后配置浏览器使用这个文件,IE的详细设置教程请看:http://www.microsoft.com/technet/prodtechnol/ie/reskit/6/part6/c26ie6rk.mspx?mfr=true

Proxy Auto Config

什么是 Proxy Auto Config

首先,我们一定要知道什么是 Proxy?他的功用是什么?如果还不知道,可以参照这份文件
PAC(Proxy Auto Config) 又是什么呢?它实际上是一个 Script;经由编写这个 Script,我们可以让系统判断在怎么样的情形下,要利用哪一台 Proxy 来进行联机。这样做主要的好处有:

1. 分散 Proxy 的流量,避免 Proxy Server 负载过高

2. 针对个别条件设定、加快浏览速度

3. 设定要求顺序,在某台 Proxy 无法联机时,可自动尝试别种联机方式

Proxy Auto Config File 的格式

基本上 Proxy Auto Config File(以下简称 PAC)是一个纯文字文件,他的语法采用 JavaScript;所以建议要学习编写 PAC 的人,最好先学习基本的 JavaScript。一个 PAC 档必需是单独的 JavaScript,其中不能包含任何 HTML 标签。

PAC 档中,一定要定义 Function FindProxyForURL 如下:

function FindProxyForURL( url, host )

{

...

}

如果使用了 PAC 档,则浏览器在接受我们要求的网址后,会去执行

ret = FindProxyForURL( url, host );

这样的指令。其中,url 是所要求网址的完整路径,host 是对方的计算机名称(就是在 :// / 之中的部份);而 return ret 则是 Proxy 的组态,它的格式有下列三种:

· DIRECT 直接联机而不透过 Proxy

· PROXY host:port 使用指定的 Proxy 伺服机

· SOCKS host:port 使用指定的 Socks 伺服机

比如说当浏览器得到的是 Proxy proxy.ncu.edu.tw:3128; Proxy proxy.csie.ncu.edu.tw:3128; DIRECT 的话,那浏览器会先尝试透过 proxy.ncu.edu.tw 来开启网页,如果无法使用,则尝试 proxy.csie.ncu.edu.tw,还是不行的话,就直接联机。

PAC 中特别的 Function

PAC 中,除了可以使用一般 JavaScript Function 外,它还定义了一些特别的 Function 可以使用:

· isPlainHostName()

· dnsDomainIs()

· localHostOrDomainIs()

· isResolvable()

· isInNet()

· dnsResolve()

· myIpAddress()

· dnsDomainLevels()

· shExpMatch()

· weekdayRange()

· dateRange()

· timeRange()

isPlainHostName( host )

host 由网址取得的主机名称。

Function 会判断 host 是否为不包含网域 (Domain)。如果是,则 return true;如果包含,则 return false

范例:

1. isPlainHostName("www") return true

2. isPlainHostName("www.netscape.com") return false

dnsDomainIs( host, domain )

host 由网址取得的主机名称。
domain
指定的网域。

Function 会判断 host 是否属于网域 domain。如果是,则 return true;否,则 return false

范例:

1. dnsDomainIs("www.netscape.com", ".netscape.com") return true

2. dnsDomainIs("www", ".netscape.com") return false

3. dnsDomainIs("www.mcom.com", ".netscape.com") return false

localHostOrDomainIs( host, hostdom )

host 由网址取得的主机名称。
hostdom
完整的网域名称。

Function 会判断 host 是否为 hostdom,或 host 是否为 hostdom 的主机名称。如果是,则 return true;否,则 return false

范例:

1. localHostOrDomainIs("www.netscape.com", "www.netscape.com") return true (完全相同)

2. localHostOrDomainIs("www", "www.netscape.com") return true (主机名称相同)

3. localHostOrDomainIs("www.mcom.com", "www.netscape.com") return false (网域不同)

4. localHostOrDomainIs("home.netscape.com", "www.netscape.com") return false (主机名称不同)

isResolvable( host )

host 由网址取得的主机名称。

Function 会尝试透过 DNS 去解析 host,如果解析成功,则 return true;否则 return false

范例:

1. isResolvable("www.netscape.com") return true (除非 DNS 无法正常运作)

2. isResolvable("bogus.domain.foobar") return false (除非真的冒出这个 domain 出来

isInNet( host, pattern, mask )

host 主机名称,可以是 Domain Name IP。如果是 Domain Name,则会透过 DNS 查出 IP
pattern IP

mask
对应于 pattern 的屏蔽。

Function host 是否在指定的 IP 范围内,如果是,则 return true;否则 return false

范例:

1. isInNet(host, "198.95.249.79", "255.255.255.255") host 198.95.249.79 时,会 return true

2. isInNet(host, "140.115.0.0", "255.255.0.0") host 140.115.*.* 时,会 return true

dnsResolve( host )

host 要透过 DNS 解晰的主机名称。

Function 会透过 DNS 去解析 hostreturn 值即为解析之结果。

范例:

1. dnsResolve("www.math.ncu.edu.tw") return "140.115.25.9"

myIpAddress()

Function return 浏览器所在计算机之 IP 地址。

dnsDomainLevels( host )

host 由网址取得的主机名称。

Function return host Domain 层数(点的数目)。

范例:

1. dnsDomainLevels("www") return 0

2. dnsDomainLevels("www.netscape.com") return 2

shExpMatch( str, shexp )

str 要进行比对的字符串。
shexp
比对的条件。

Function 会比对 str 是否符合 shexp 的表示式(此表示式为 shell expression 而非 regular expressions)。如果是,则 return true;否则 return false

范例:

1. shExpMatch("http://home.netscape.com/people/ari/index.html", "*/ari/*") return true

2. shExpMatch("http://home.netscape.com/people/montulli/index.html", "*/ari/*") return false

weekdayRange()dateRange()timeRange()

这三个 Function 的功用都是检查线在时间是否在指定范围内,用这些 Function 就可以设定分时段使用 Proxy Server。但由于较为繁琐,如有兴趣或需要,请参考原始文件

范例

1.中央大学数学系之设定

2. function FindProxyForURL( url, host ){

3. if ( dnsDomainIs( host, "locahost" ) || dnsDomainIs( host, ".edu.tw" ) || isInNet( host, "140.0.0.0", "255.0.0.0" ) || isPlainHostName( host ) )

4. {

5. return "DIRECT; PROXY proxy.csie.ncu.edu.tw:3128;" + " PROXY cache.math.ncu.edu.tw:3128";

6. //localhost domain .edu.twIP 140.*.*.* 或只有 Host Name

7. //则直接联机;如果直接联机不行,则尝试使用 proxy.csie cache.math

8. }else if ( dnsDomainIs( host, ".tw" ) )

9. {

10. return "PROXY proxy.csie.ncu.edu.tw:3128;" + " PROXY cache.math.ncu.edu.tw:3128;" + " DIRECT";

11. //如果网域是 .tw,则依序尝试 proxy.csiecache.math、直接联机

12. }else

13. return "PROXY cache.math.ncu.edu.tw:3128;" + " PROXY proxy.csie.ncu.edu.tw:3128;" + " DIRECT";

14. //其它:依序尝试 cache.mathproxy.csie、直接联机

15. }

16. 中央大学计算器中心提供之设定

17. function FindProxyForURL(url,host)

18. {

19. var RFC="1234567890-_qwertyuiopasdfghjklzxcvbnmQWERTYUIOPASDFGHJKLZXCVBNM.";

20. for(var i=0;i < host.length;i++)

21. {

22. var c=host.charAt(i);

23. if(RFC.indexOf(c)==-1 && !(dnsDomainIs(host, ".cc") || dnsDomainIs(host,".tw"))) {

24. // alert(url+"--"+host);

25. return "PROXY dnsrelay.twnic.net.tw:3127";

26. }

27. }

28. if(host == 'auto.search.msn.com')

29. return "PROXY keyword.twnic.net.tw:80";

30.

31. if(dnsDomainIs(host, ".tw"))

32. {

33. return "DIRECT";

34. }

35. return "PROXY proxy.ncu.edu.tw:3128; PROXY cache.ncu.edu.tw:3128; DIRECT";

36. }

参考数据

·

相关文章:

  • DB2 导出数据(CSV格式)
  • WinXP下搭建virtualbox+ubuntu10.04+LAMP+tomcat6环境小记
  • WCF开发之消息契约(MessageContract)
  • nebula
  • WinXP下VirtualBox虚拟Ubuntu系统文件夹共享
  • About me
  • h264解码时的AVCDecoderConfigurationRecord 与 CodecPrivateData
  • PHP导出数据到淘宝助手CSV的方法分享
  • 公司最近招招.net程序员
  • 从一棵“微博树”透视物联网的未来
  • 挚爱一生---结婚周年纪念
  • 我对国内软件开发类书籍出版与写作的体会与努力
  • 『软件周边』ColorSchemer Studio 2.0 注册码
  • 转 如何有效的使用C#读取文件 及如何解决中文乱码问题
  • 说出你的想法,赢取Windows Phone 7手机
  • create-react-app项目添加less配置
  • CSS选择器——伪元素选择器之处理父元素高度及外边距溢出
  • E-HPC支持多队列管理和自动伸缩
  • electron原来这么简单----打包你的react、VUE桌面应用程序
  • HTTP传输编码增加了传输量,只为解决这一个问题 | 实用 HTTP
  • Solarized Scheme
  • unity如何实现一个固定宽度的orthagraphic相机
  • v-if和v-for连用出现的问题
  • Webpack 4 学习01(基础配置)
  • Yii源码解读-服务定位器(Service Locator)
  • 编写符合Python风格的对象
  • 构建二叉树进行数值数组的去重及优化
  • 解析 Webpack中import、require、按需加载的执行过程
  • 开放才能进步!Angular和Wijmo一起走过的日子
  • 看域名解析域名安全对SEO的影响
  • 前端技术周刊 2019-01-14:客户端存储
  • 原生Ajax
  • 支付宝花15年解决的这个问题,顶得上做出十个支付宝 ...
  • 直播平台建设千万不要忘记流媒体服务器的存在 ...
  • #NOIP 2014#Day.2 T3 解方程
  • #ubuntu# #git# repository git config --global --add safe.directory
  • $$$$GB2312-80区位编码表$$$$
  • (2015)JS ES6 必知的十个 特性
  • (算法二)滑动窗口
  • (万字长文)Spring的核心知识尽揽其中
  • (学习日记)2024.03.12:UCOSIII第十四节:时基列表
  • (学习日记)2024.04.10:UCOSIII第三十八节:事件实验
  • (一) springboot详细介绍
  • (一)Thymeleaf用法——Thymeleaf简介
  • ****** 二 ******、软设笔记【数据结构】-KMP算法、树、二叉树
  • .NET Compact Framework 3.5 支持 WCF 的子集
  • .NET Core 2.1路线图
  • .NET Core WebAPI中封装Swagger配置
  • @GetMapping和@RequestMapping的区别
  • [2017][note]基于空间交叉相位调制的两个连续波在few layer铋Bi中的全光switch——
  • [30期] 我的学习方法
  • [AutoSar NVM] 存储架构
  • [CLickhouse] 学习小计
  • [Enterprise Library]调用Enterprise Library时出现的错误事件之关闭办法
  • [iHooya]2023年1月30日作业解析