[Proxy Auto Config]GoogleWebAccelerator用的Proxy.pac代理原理介绍

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 去解析 host,return 值即为解析之结果。

范例:

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.tw、IP 为 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.csie、cache.math、直接联机

12.                                   }else

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

14.                                                   //其它:依序尝试 cache.math、proxy.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.                    }

时间: 2024-12-03 05:36:49

[Proxy Auto Config]GoogleWebAccelerator用的Proxy.pac代理原理介绍的相关文章

IPv6 auto config原理详解:前缀公告

人们常说,IPv6的一大特性就是移动性. 那么对于IP终端来说,如何去理解他的移动性呢? 其实就是IPv6的无状态自动配置. 前段时间有幸一个同事给我演示了一下这个功能,但是更多的疑问产生了. IPv4中,比如说电脑,在网卡中设置自动获取IP地址和DNS.那么就可以自动从DHCP服务器上面获得IP地址和DNS还有网关了. 下面是IPv4的设置界面: 那么按照这个逻辑,IPv6就应该是没有这些选项,最终达到即插即用的目的嘛?答案是否,下面的截图IPv6也有: 那么为什么还需要自动配置? 意义在哪里

ebs系统架构简介5——Auto Config

AD 工具中有一个相当重要的,就是 AutoConfig.主要是简化和标准化配置管理任务.参考文档: Using AutoConfig to Manage System Configurations in Oracle E-Business Suite Release 12 (文档 ID 387859.1) R12 将所有的配置参数集中在 context file 中, app tier 一个context file:db tier 一个 context file. 例如,如果用户要修改Apac

如何使用Proxy模式及Java内建的动态代理机制

1.Proxy模式 代理模式支持将某些操作从实际的对象中分离出来,通过它的代理类提供处理.这样便于修改和管理这些特定的操作. 下面示例一个代理模式的实现. <<interface>>Subject.java package com.zj.proxy; public interface Subject { void operation1(); void operation2(String arg); } 现实类RealSubject.java package com.zj.proxy

Aliyun OSS Nginx proxy module(阿里云OSS Nginx 签名代理模块)

1.此文章主要介绍内容 本文主要介绍如何利用Nginx lua 实现将阿里云OSS存储空间做到同本地磁盘一样使用.核心是利用Nginx lua 对OSS请求进行签名并利用内部跳转将所有访问本地Nginx的请求加上OSS 签名转发给OSS,实现本地Nginx无缝衔接阿里云OSS,存储空间无限扩展,存储成本无限下降,数据安全%99.99...... . 2.本篇文章使用到的一些工具技术及如何学习和获取 1.lua 本文用到的都是一些基本的lua,基本上花半小时阅读下lua的语法就可以轻松理解本文内容

代理服务器是什么?

什么是代理服务器 Web代理(proxy)服务器是网络的中间实体. 代理位于Web客户端和Web服务器之间,扮演"中间人"的角色. HTTP的代理服务器即是Web服务器又是Web客户端. Fiddler就是个典型的代理 Fiddler 是以代理web服务器的形式工作的,它使用代理地址:127.0.0.1, 端口:8888. 当Fiddler退出的时候它会自动注销代理,这样就不会影响别的程序. 代理的作用一, 翻墙 很多人都喜欢用Facebook, 看youTube.但是我们在天朝,天朝

Linux 命令行下嗅探 HTTP 流量的工具:httpry

Linux 命令行下嗅探 HTTP 流量的工具:httpry 假设由于某种原因,你需要嗅探HTTP站点的流量(如HTTP请求与响应).举个例子,你可能在测试一个web服务器的实验性功能,或者你在为某个web应用或RESTful服务排错,又或者你正在为PAC(proxy auto config)排错或寻找某个站点下载的恶意软件.不论什么原因,在这些情况下,进行HTTP流量嗅探对于系统管理.开发者.甚至最终用户来说都是很有帮助的. 数据包嗅工具tcpdump被广泛用于实时数据包的导出,但是你需要设置

git clone Google的代码失败的解决方法

       git clone Google的volley代码遇Q.        想到用代理服务器就可以解决这个问题.Google了一下解决方法,记录下来,分享一下.        git config:                           设置代理服务器: git config --global http.proxy http://proxyuser:proxypwd@proxy.server.com:8080 git config --global https.proxy

zabbix proxy configure (optional)

zabbix proxy的部署分3个部分. 1. 安装proxy 2. 配置proxy配置文件, 启动proxy 3. 在zabbix WEB接口中添加proxy. 1. zabbix的安装, web接口的配置以及zabbix server 的配置请参考 : http://blog.163.com/digoal@126/blog/static/1638770402014731111811804/ http://blog.163.com/digoal@126/blog/static/1638770

Ubuntu10下如何搭建MySQL Proxy读写分离探讨_Mysql

一.MySQL-Proxy基础 MySQL Proxy是一个处于你的Client端和MySQL server端之间的简单程序,它可以监测.分析或改变它们的通信.它使用灵活,没有限制,常见的用途包括:负载平衡,故障.查询分析,查询过滤和修改等等. (Figure1:MySQL Proxy) MySQL-Proxy, announced in June, is a binary application that sits between your MySQL client and server, a