基本语法
各种代理中的Pac规则文件其实都是一个包含有 FindProxyForURL(url, host)
方法的 JS 文件
function FindProxyForURL(url, host) {
// 这里面写各种规则
// 返回的是字符串:
// - "DIRECT" 直接连接
// - "PROXY: 127.0.0.1:1080" 代理连接
}
// *********
// 看个例子
// *********
// 可以先把返回的结果弄成变量,省劲
var direct = "DIRECT";
var socks = "SOCKS5 127.0.0.1080";
function FindProxyForURL(url, host) {
// 如果域名匹配,直接连接
if (dnsDomainIs(host, "intranet.domain.com") ||
shExpMatch(host, "(*.abcdomain.com|abcdomain.com)"))
return "DIRECT";
// 如果 URL 或者 协议匹配,直接连接
if (url.substring(0, 4)=="ftp:" ||
shExpMatch(url, "http://abcdomain.com/folder/*"))
return "DIRECT";
// 如果访问的链接是内网,直接连接
if (isPlainHostName(host) ||
shExpMatch(host, "*.local") ||
isInNet(dnsResolve(host), "10.0.0.0", "255.0.0.0") ||
isInNet(dnsResolve(host), "172.16.0.0", "255.240.0.0") ||
isInNet(dnsResolve(host), "192.168.0.0", "255.255.0.0") ||
isInNet(dnsResolve(host), "127.0.0.0", "255.255.255.0"))
return "DIRECT";
// 如果访问的IP属于一个子网,则通过代理访问
if (isInNet(myIpAddress(), "10.10.5.0", "255.255.255.0"))
return "PROXY 1.2.3.4:8080";
// 默认返回值,按照顺序选择可执行的,第一无法连接就换第二个
return "PROXY 4.5.6.7:8080; PROXY 7.8.9.10:8080";
}
PAC 可执行一些方法有
- dnsDomainIs
- shExpMatch
- isInNet
- myIpAddress
- dnsResolve
- isPlainHostName
- localHostOrDomainIs
- isResolvable
- dnsDomainLevels
- weekdayRange
- dateRange
- timeRange
- alert
好了,可以做个自己的 PAC 文件了,放到浏览器的代理插件上,根据自己的需要,上网更科学。