PAC函数

PAC文件所支持的函数均在Netscape制定的标准中给予了明确的定义,目前的主流浏览器都能够兼容,标准中包含的函数有dnsDomainIs, shExpMatch, isInNet, myIpAddress, dnsResolve, isPlainHostName, localHostOrDomainIs, isResolvable, dnsDomainLevels, weekdayRange, dateRange, timeRange共计12个函数。
浏览器在解析PAC文件的过程中,仅支持指定的函数集,即使是JavaScript中的函数也不行。这是因为浏览器处理PAC文件的过程是在沙盒环境中的,该环境仅支持了PAC的函数集。

重点

PAC文件仅支持Netscape在标准中定义的12个函数,不支持其它JavaScript函数。

提示

  • host字段不区分大小写
  • host出现多次的情况下,仅在首次执行DNS解析过程,后续host解析结果将使用浏览器缓存

以下为每个函数的详细功能说明

shExpMatch

主要用于通过SHELL正则表达式来匹配主机名或者URL,当请求匹配时返回true
重要程度: 五星

// A request for the host direct.test.com or any request for a file or folder in the
// location http://test.com/direct/ will be sent direct to the Internet.

if (shExpMatch(host, "direct.test.com") ||
    shExpMatch(url, "http://test.com/direct/*"))
    return "DIRECT";
1
2
3
4
5
6

dnsDomainIs

主要用于匹配或反匹配指定主机名,当请求的host匹配时返回true
重要程度: 四星

// If the hostname matches baidu.com or www.baidu.com
// send direct to the Internet.

if (dnsDomainIs(host, "baidu.com") || dnsDomainIs(host, "www.baidu.com"))
    return "DIRECT";
1
2
3
4
5

isInNet

主要用于匹配IP地址是否在指定的地址段内,匹配则返回true
通常函数会和dnsResolve结合使用,将主机名转化为IP后进行匹配; 也和myIpAddress结合使用区分本地网络。
重要程度:四星

// If IP of requested website website falls within IP range, send direct to the Internet.

if (isInNet(dnsResolve(host), "192.168.1.0", "255.255.255.0"))
    return "DIRECT";
1
2
3
4

myIpAddress

获取本地主机的IP地址。
重要程度:一星

注意

在本机有多个IP地址的情况下,获取的结果可能和预期不符合。比如可能获取到IPv6地址,127.0.0.1,其它网卡的IP地址等。
在IPv6的环境下,不建议使用本函数。在Windowns特定的浏览器环境下,可以考虑新版本FindProxyForURLEx()以适配IPv6,但跨浏览器支持尚且不足。

var myip = myIpAddress(host);
1

dnsResolve

获取请求主机的IP地址。
重要程度:四星

var hostip=dnsResolve(host);
1

isPlainHostName

如果请求主机不包含任何.字符,则返回true
主要适用于判断请求是本地资源的情况,因为只有本地资源才能适配这种格式
重要程度:三星

// If user requests plain hostnames, e.g. http://intranet/, 
// http://webserver-name01/, send direct.

if (isPlainHostName(host))
    return "DIRECT";
1
2
3
4
5

localHostOrDomainIs

如果请求的完整域名或者主机名匹配,则返回true
重要程度:三星

// If the Host requested is "www" or "www.test.com", send direct.

if (localHostOrDomainIs(host, "www.test.com"))
    return "DIRECT";
1
2
3
4

isResolvable

如果主机名能够解析到一个IP地址,则返回true
重要程度:二星

注意

如果域名无法解析,该函数会导致请求延迟。

// If the host requested can be resolved by DNS, send via proxy1.example.com.

if (isResolvable(host))
    return "PROXY proxy.test.com";
1
2
3
4

dnsDomainLevels

该函数返回请求主机域名层级(简单理解为请求主机有几个.符号)
重要程度:三星

// If hostname contains any dots, send via proxy.test.com, otherwise send direct.

if (dnsDomainLevels(host) > 0)
    return "PROXY proxy.test.com";
    else return "DIRECT";
1
2
3
4
5

weekdayRange

如果当前时间匹配指定星期范围,则返回true
重要程度:三星

// If during the period of Monday to Friday, proxy.test.com will be returned, otherwise
// users will go direct for any day outside this period.

if (weekdayRange("MON", "FRI")) return "PROXY proxy.test.com";
    else return "DIRECT";
1
2
3
4
5

dateRange

如果当前时间匹配指定月份范围,则返回true
重要程度:三星

// If during the period of January to March, proxy.test.com will be returned, otherwise
// users will go direct for any month outside this period.

if (dateRange("JAN", "MAR")) return "PROXY proxy.test.com";
    else return "DIRECT";
1
2
3
4
5

timeRange

如果当前时间匹配指定小时范围,则返回true
重要程度:三星

// If during the period 9:00 to 18:00, proxy.test.com will be returned, otherwise
// users will go direct for any time outside this period.

if (timeRange(9, 18)) return "PROXY proxy.test.com";
    else return "DIRECT";
1
2
3
4
5
更新时间: