文章目录
- 1.pac 定义
- 2. 参考配置地址
- 3. 实际配置案例
- 3.1 编写pac文件
- 3.1.1 return 语句有三种指令:
- 3.1.2 内置函数
- 3.1.2.1 dnsDomainIs
- 3.1.2.2 shExpMatch
- 3.1.2.3 isInNet
- 3.1.2.4 主机ip
- 3.1.2.5 dnsResolve
- 3.1.2.6 isPlainHostName
- 3.1.2.7 isResolvable
- 3.1.2.8 dnsDomainLevels
- 3.2 配置nginx,将pac文件上传到服务器
- 3.3 配置自动代理
1.pac 定义
PAC,一个自动代理配置脚本,包含了很多使用 JavaScript 编写的规则,它能够决定网络流量走默认通道还是代理服务器通道,控制的流量类型包括:HTTP、HTTPS 和 FTP。
本质是一段js
function FindProxyForURL(url, host) {
return "DIRECT";
}
2. 参考配置地址
地址:pac配置地址
3. 实际配置案例
3.1 编写pac文件
下面这段表示的是如果是本机ip192.168.8.0网段的,就走192.168.2.207:443代理,如果不是的话,就直连
function FindProxyForURL(url, host) {
if (isInNet(myIpAddress(), "192.168.8.0", "255.255.255.0")) {
return "PROXY 192.168.2.207:443";
}
return "DIRECT";
}
3.1.1 return 语句有三种指令:
- DIRECT,表示无代理直接连接
- PROXY host:port,表示走host:port 的 proxy 服务
- SOCKS host:port,表示走host:port 的 socks 服务
3.1.2 内置函数
3.1.2.1 dnsDomainIs
类似于 ==,但是对大小写不敏感,
if (dnsDomainIs(host, "google.com") ||
dnsDomainIs(host, "www.google.com")) {
return "DIRECT";
}
3.1.2.2 shExpMatch
Shell 正则匹配,* 匹配用的比较多,可以是*.http://example.com,也是可以下面这样,
if (shExpMatch(host, "vpn.domain.com") ||
shExpMatch(url, "http://abcdomain.com/folder/*")) {
return "DIRECT";
}
3.1.2.3 isInNet
判断是否在网段内容,比如 10.1.0.0 这个网段,10.1.1.0 就在网段中,
if (isInNet(dnsResolve(host), "172.16.0.0", "255.240.0.0")) {
return "DIRECT";
}
3.1.2.4 主机ip
if (isInNet(myIpAddress(), "10.10.1.0", "255.255.255.0")) {
return "PROXY 10.10.5.1:8080";
}
3.1.2.5 dnsResolve
通过 DNS 查询主机 ip,
if (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";
}
3.1.2.6 isPlainHostName
判断是否为诸如http://barret/,http://server-name/ 这样的主机名,
if (isPlainHostName(host)) {
return "DIRECT";
}
3.1.2.7 isResolvable
判断主机是否可访问
if (isResolvable(host)) {
return "PROXY proxy1.example.com:8080";
}
3.1.2.8 dnsDomainLevels
返回是几级域名,比如dnsDomainLevels(http://barretlee.com) 返回的结果就是 1,
if (dnsDomainLevels(host) > 0) {
return "PROXY proxy1.example.com:8080";
} else {
return "DIRECT";
}
3.2 配置nginx,将pac文件上传到服务器
本案例放置pac文件的路径
nginx 配置
location /proxy.pac {
alias /usr/local/openresty/nginx/pac/proxy.pac; //绝对路径
}