代理自动配置文件PAC
来源 https://zhuanlan.zhihu.com/p/31287042
代理自动配置(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";}
如果访问域名是http://baidu.com或者url地址"http://*.http://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