代理自动配置文件PAC 代理自动配置文件PAC

来源 https://zhuanlan.zhihu.com/p/31287042

chrome://net-export/
chrome://net-internals/#proxy
chrome://net-internals/#events
https://netlog-viewer.appspot.com/

https://github.com/MamoruAsagami/PacTestBench
Usage: java -jar build/libs/PacTestBench.jar [options] pac-file url-list-file [>report.txt]

注意: isInNet dnsResolve 会造成浏览器访问缓慢 

代理自动配置(Proxy auto-config,PAC),该文件定义浏览器如何自动选择适当的代理服务区来访问一个网站。一个PAC文件包含一个JavaScript形式的函数“FindProxyForURL(url,host)”,该函数可返回一个包含一个或者多个访问规则的字符串。浏览器或者其他应用可根据该字符串确定使用哪个代理服务器。

PAC*说明:点击查看

官网functions说明:点击查看

PAC文件简单格式:

function FindProxyForURL(url, host) {
  if(shExpMatch(url,"*.baidu.com/*")){
  return "PROXY 127.0.0.1:8080";}
}

二、PAC文件可用Functions

PAC文件可分析用户URL地址从而分配不同的代理服务器,不同的Functions可进行不同的判断。

1)dnsDomainIs

说明:如果访问的主机名(域名)匹配上,则返回true。只能使用host。

示例:

if(dnsDomainIs(host,"baidu.com")){
    return "DIRECT";}

2)shExpMatch

说明:将主机名或者URL地址与shell表达式进行匹配,成功则返回true。

示例:

if(shExpMatch(host,"baidu.com") || 
   shExpMatch(url,"http://*.sina.com/*")){
return "DIRECT";}

如果访问域名是sina.com/*的,则直接进行访问

3)dnsResolve

说明:解析主机名为IP,此功能减少DNS查询次数。

示例:

if(isInNet(dnsResolve(host),"192.168.0.0","255.255.0.0"){
return "DIRECT";}

4)isInNet

说明:匹配域名(或主机)的IP地址,如果在指定子网内,则返回true。如果匹配的是主机名,该函数会将该主机名解析为IP

示例:

if(isInNet(host,"192.168.21.0","255.255.255.0") || 
   isInNet(dnsResolve(host),"192.168.21.0","255.255.255.0")){
return "DIRECT";}

5)myIpAddress

说明:返回本地主机的IP

示例:

if(isInNet(myIpAddress(),"192.168.107.0","255.255.255.0")){
return "PROXY 127.0.0.1:8080";}

6)isPlainHostName

说明:如果主机名中不包含点(.),则返回true。该函数只用于host

示例:

if(isPlainHostName(host)){
return "DIRECT";}

7)localHostOrDomainIs

说明:只有找到确切的主机名,才返回true。

示例:

if(localHostOrDomainIs(host,"wenku.my.com")){
return "PROXY 127.0.0.1:90";}

访问wenku.my.com,wenku.sina.com都会返回true,使用127.0.0.1:90的代理。因为主机名是wenku。

8)isResolvable

说明:如果主机名能解析为IP,则返回true。注意:如果主机名不能解析,可能会导致浏览器暂时挂起。

示例:

if(isResolvable(host)){
return "DIRECT";}

9)dnsDomainLevels

说明:此函数会返回主机名的域级别数(.的数量)

示例:

if(dnsDomainLevels(host) > 1 && dnsDomainIs(host,"baidu.com")){
return "PROXY 127.0.0.1:90;192.168.1.21:8080";} 

10)weekdayRange

说明:允许基于“周”时间的规则。MON,TUE,WED,THU,FRI,SAT,SUN

示例:

if(weekdayRange("MON","SUN")){
return "DIRECT";}
else {
return "PROXY 127.0.0.1:90";}

11)dateRange

说明:允许基于“月”时间的规则。JAN,FEB,MARCH,APR,MAY,JUN,JUL,AUG,SEP,OCT,NOV,DEC

示例:

if(dateRange("JAN","SEP","JUN")){
return "DIRECT";}

12)timeRange

说明:允许基于“小时”时间的规则。

示例:

if(timeRange(8,18) && weekdayRange("MON","TUE")){
return "PROXY 127.0.0.1:90";}

13)alert

说明:原始PAC规范中没有这个函数,但有的浏览器是支持这个函数的。这可用用来纠正PAC文件错误。没测试成功。

示例:

if(timeRange(8,18) && weekdayRange("MON","TUE")){alert("IN Time!");}

三、注意事项

1)return 返回数据类型

DIRECT 表示无代理直接访问

PROXY Host:Port 表示通过Host:Port的proxy服务上网

SOCKS Host:Port 表示通过Host:Port的socks服务上网

2)return可进行串联

例:return "PROXY 127.0.0.1:8080; SOCKS 127.0.0.1:9090; DIRECT";

如果代理挂了或者访问超时,依次类推使用后边的配置。达到容灾目的。

3)PAC文件被访问是,返回的文件类型(Content-Type)应该为:application/x-ns-proxy-autoconfig。如果不写,浏览器也能自动识别

4)上述functions对大小写不敏感

5)dnsResolve(host)是解析出来放到自己的缓存中,不过系统中也有存在缓存数据。

6)https请求拿不到完整网址,只能使用主机名。(没做实验,这是网上评论)

========= End