Please enable Javascript to view the contents

自动代理配置脚本

 ·  ☕ 5 分钟

#自动代理配置脚本

以下十个脚本提供 JavaScript 。 正如使用自动配置、自动代理和自动检测中所述,您可以使用 .pac 文件并根据用户浏览器的 URL 请求来自动配置代理。

每个脚本都包括函数 FindProxyForURL(, ),其中 是正在访问的完整 URL 地址, 指的是从该 URL 提取出的主机名称。 要使用这些脚本,您必须将占位符更改为代理服务器名称、端口号(通常为 80)及 IP 地址,以指代组织中实际的名称、端口号和地址。

noteNote

这些脚本中使用的 isInNet、isResolvable 和 dnsResolve 函数会向域名系统 (DNS) 服务器发出查询请求。

以下是脚本示例的列表:

示例 1: 本地主机直接连接,所有其他主机使用代理连接

示例 2: 防火墙内的主机直接连接,本地服务器外部的主机使用代理连接

示例 3: 如果主机是可解析的,则直接连接,否则使用代理连接

示例 4: 如果主机位于指定子网内,则直接连接,否则使用代理连接

示例 5: 根据主机域决定连接类型

示例 6: 根据使用的协议决定连接类型

示例 7: 通过检查主机名是否与 IP 地址匹配来决定代理设置

示例 8: 如果主机 IP 与指定 IP 匹配,则使用代理连接,否则直接连接

示例 9: 如果主机名中包含任何圆点,则使用代理连接,否则直接连接

示例 10: 指定在一周的哪几天里使用代理连接,在其他日期里则直接连接

示例 1: 本地主机直接连接,所有其他主机使用代理连接

以下函数检查主机名是否是本地主机,如果是,所用的是否为直接连接。 如果主机名不是本地主机,则通过代理服务器()建立连接。

1
2
3
4
5
6
7
function FindProxyForURL(url, host)
     {
     if (isPlainHostName(host))
     return "DIRECT";
     else
     return "PROXY proxy:80";
 }

isPlainHostName 函数会检查主机名中是否包含任何圆点(英文句号)。 如果包含,则返回 false;如果不包含,则返回 true。

示例 2: 防火墙内的主机直接连接,本地服务器外部的主机使用代理连接

以下函数检查主机名是否是“纯”主机名(其中不包含域名)或特定域(如 <.company.com>)的一部分且主机名中不包含文本“www”或“home”。

1
2
3
4
5
6
7
8
9
function FindProxyForURL(url, host){
     if ((isPlainHostName(host) ||
         dnsDomainIs(host, ".company.com")) &&
         !localHostOrDomainIs(host, "www.company.com") &&
         !localHostOrDomainIs(host, "home.company.com"))
        return "DIRECT";
     else 
        return "PROXY proxy:80";
 }

noteNote

只有针对属于本地域的 URL 才运行 localHostOrDomainIs 函数。 如果主机名的域与给定的域相匹配,则 dnsDomainIs 函数返回 true。

示例 3: 如果主机是可解析的,则直接连接,否则使用代理连接

以下函数请求 DNS 服务器解析传递给它的主机名。 如果能够解析该主机名,则使用直接连接。 如果不能解析主机名,则使用 建立连接。 当使用内部 DNS 服务器来解析所有内部主机名时,这种做法非常有用。

1
2
3
4
5
6
7
8
 function FindProxyForURL(url, host)
 {
     if (isResolvable(host))
        return "DIRECT";
     else
        return "PROXY proxy:80";
 }

noteNote

本脚本中使用的 isResolvable 函数会向 DNS 服务器发出查询请求。

示例 4: 如果主机位于指定子网内,则直接连接,否则使用代理连接

以下函数将给定的 IP 地址结构和子网掩码与主机名进行比较。 如果子网内的特定主机需要直接连接,而其他主机需要使用代理进行连接,则这种做法非常有用。

1
2
3
4
5
6
7
8
function FindProxyForURL(url, host)
 {
     if (isInNet(host, "999.99.9.9", "255.0.255.0"))
        return "DIRECT";
     else
        return "PROXY proxy:80";
 }

如果 IP 地址与给定的(如 <999.99.9.9>)相匹配,则 isInNet(, , ) 函数返回 true。 表示 IP 地址应匹配哪个部分(255=匹配,0=忽略)。

noteNote

本脚本中使用的 isInNet 函数会向 DNS 服务器发出查询请求。

示例 5: 根据主机域决定连接类型

如果是本地主机,则以下函数将指定使用直接连接。 如果不是本地主机,则该函数将根据主机域决定使用哪个代理()。 如果在选择代理时,主机域名是条件之一,则这种做法非常有用。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
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";
 }

如果 shell 表达式模式匹配,则 shExpMatch(, ) 函数返回 true。

示例 6: 根据使用的协议决定连接类型

以下函数提取正在使用的协议,并据此作出代理服务器选择()。 如果与协议不匹配,则使用直接连接。 如果在选择代理时,所使用的协议是条件之一,则这个函数非常有用。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
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";
     }
 }

本示例中的 substring 函数将从字符串的起始处提取指定数目的字符。

示例 7: 通过检查主机名是否与 IP 地址匹配来决定代理设置

以下函数通过将主机名转换为 IP 地址并将其与指定字符串(如 <999.99.99.999>)相比较来选择代理服务器。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
function FindProxyForURL(url, host)
 {
    if (dnsResolve(host) == "999.99.99.999") { // = http://secproxy
        return "PROXY secproxy:8080";
    }
    else {
        return "PROXY proxy:80";
    }
 }

noteNote

本脚本中使用的 dnsResolve 函数会向 DNS 服务器发出查询请求。

示例 8: 如果主机 IP 与指定 IP 匹配,则使用代理连接,否则直接连接

以下函数是另一种根据指定 IP 地址来选择代理的方法。

1
2
3
4
5
6
7
8
function FindProxyForURL(url, host)
 {
    if (myIpAddress() == "999.99.999.99") {
        return "PROXY proxy:80"; }
    else {
        return "DIRECT";
    }
 }

myIpAddress 函数返回浏览器在其上运行的主机的 IP 地址(整数-圆点格式)。 与示例 7 不同,本示例使用函数调用来显式获得数字 IP 地址。 (示例 7 使用 dnsResolve 将主机名转换为数字 IP 地址。)

示例 9: 如果主机名中包含任何圆点,则使用代理连接,否则直接连接

以下函数会检查主机名中包含多少个圆点(英文句号)。 如果主机名中包含任何圆点,则浏览器将使用建立连接。 如果主机名中不包含圆点,则浏览器将直接建立连接。 这是另一种根据主机名特征来确定连接类型的方法。

1
2
3
4
5
6
7
function FindProxyForURL(url, host)
 {
    if (dnsDomainLevels(host) > 0) { // if number of dots in host > 0
        return "PROXY proxy:80";
    }
    return "DIRECT";
 }

dnsDomainLevels 函数返回一个整数值,代表主机名中包含的圆点数。

示例 10: 指定在一周的哪几天里使用代理服务器连接,在其他日期里则直接连接

以下函数通过指定浏览器在一周的哪几天里使用代理服务器()来确定连接类型。 对于范围以外的日期,浏览器直接建立连接。 当您希望在网络流量大的时候使用代理而在网络流量不大的时候使用直接连接的情况下,这个函数非常有用。

1
2
3
4
5
6
7
function FindProxyForURL(url, host)
 {
    if(weekdayRange("WED", "SAT", "GMT"))
        return "PROXY proxy:80";
    else
        return "DIRECT";
 }

如果当前系统时间刚好位于参数和可选参数指定的日期范围内,则 weekdayRange( [, ] [,“GMT”] ) 函数将返回 true。 可选的 GMT 参数指定采用的是格林尼治标准时间,而非当地时间。