PAC脚本语法(代理自动配置)

现在浏览器基本都支持PAC格式的代理脚本。本文仅介绍PAC脚本语法,并不解释使用方法。

示例脚本

function FindProxyForURL(url, host) {
    // our local URLs from the domains below example.com don't need a proxy:
    if (shExpMatch(host, "*.example.com")) {
        return "DIRECT";
    }

    // URLs within this network are accessed through
    // port 8080 on fastproxy.example.com:
    if (isInNet(host, "10.0.0.0", "255.255.248.0")) {
        return "PROXY fastproxy.example.com:8080";
    }

    // All other requests go through port 8080 of proxy.example.com.
    // should that fail to respond, go directly to the WWW:
    return "PROXY proxy.example.com:8080; DIRECT";
}

主体

PAC脚本主体是一个FindProxyForURL的JS函数。函数的反回值有三类:

function FindProxyForURL(url,host) {
  if(host=="http://www.domain.com/") return "DIRECT";
  return "PROXY myproxy:80;PROXY myotherproxy:8080;DIRECT";

}

函数

isPlainHostName(host)
判断是否是本地主机
dnsDomainIs(host,domain) localHostOrDomainIs(host,"")
判断访问主机是否属于某个域和某个域名

示例:

function FindProxyForURL(url, host) {
    if ((isPlainHostName(host) ||
    dnsDomainIs(host, ".company.com")) &&
    !localHostOrDomainIs(host, "http://www.company.com/") &&
    !localHostOrDomainIs(host, "home.company.com"))

        return "DIRECT";
    else
        return "PROXY proxy:80";
}
isResolvable(host)
主机名是否能被dns服务器解析

示例:

function FindProxyForURL(url, host) {
    if (isResolvable(host))
        return "DIRECT";
    else
        return "PROXY proxy:80";
}
isInNet(host,"","")
访问IP是否在某个子网内
shExpMatch(host,"")
主机名判断

示例:

function FindProxyForURL(url, host) {
    if (isPlainHostName(host))
        return "DIRECT";
    else if (shExpMatch(host, "*.com"))
        return "PROXY comproxy:80";
    else if (shExpMatch(host, "*.edu"))
        return "PROXY eduproxy:80";
    else
        return "PROXY proxy:80";
}
url.substring(0,n)
截取协议字符串

示例:

function FindProxyForURL(url, host) {
    if (url.substring(0, 5) == "http:") {
        return "PROXY proxy:80";
    }
    else if (url.substring(0, 4) == "ftp:") {
        return "PROXY fproxy:80";
    }
    else if (url.substring(0, 7) == "gopher:") {
        return "PROXY gproxy";
    }
    else if (url.substring(0, 6) == "https:") {
        return "PROXY secproxy:8080";
    } else {
        return "DIRECT";
    }
}
dnsResolve(host)
域名ip解析

示例:

function FindProxyForURL(url, host) {
    if (dnsResolve(host) == "166.111.8.237") {
        return "PROXY secproxy:8080";
    } else {
        return "PROXY proxy:80";
    }
}

原文:https://blog.csdn.net/xundh/article/details/48193369


已发布

分类

来自

标签:

评论

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注