本节提供详细的 JavaScript 函数示例。
在本例中,浏览器直接连接到非全限定的所有主机以及本地域中的主机。所有其他主机均要经过名为 w3proxy.example.com:8080 的代理。
如果此代理出现故障,则自动进行直接连接。
function FindProxyForURL(url, host) { if (isPlainhost name(host) || dnsDomainIs(host, ".example.com") || dnsDomainIs(host, ".mcom.com")) return "DIRECT"; else return "PROXY w3proxy.example.com:8080; DIRECT"; }
本例类似于示例 1:代理除本地主机之外的所有服务器,只是它将对防火墙外部的本地服务器使用代理。如果存在属于本地域而位于防火墙之外的主机(如主 Web 服务器),并且只有通过代理服务器才能访问到这些主机,则使用 localHostOrDomainIs()() 函数来处理这些例外情况:
function FindProxyForURL(url, host) { if ((isPlainhost name(host) || dnsDomainIs(host, ".example.com")) && !localHostOrDomainIs(host, "www.example.com") && !localHostOrDoaminIs(host, "merchant.example.com")) return "DIRECT"; else return "PROXY w3proxy.example.com:8080; DIRECT"; }
本例对 example.com 域中除本地主机之外的所有主机使用代理。主机 www.example.com 和 merchant.example.com 也要经过代理。
指定适当的例外情况顺序可以提高效率:localHostOrDomainIs()() 函数仅对本地域中的 URL 才会执行,而不是对于每个 URL 都要执行。请特别留意 and 表达式之前的 or 表达式两边的括号。
本例适用于内部 DNS 仅解析内部主机名的环境,其目的是仅对无法解析的主机使用代理。
function FindProxyForURL(url, host) { if (isResolvable(host)) return "DIRECT"; else return "PROXY proxy.mydomain.com:8080"; }
本例要求每次都查询 DNS。因此,可将本例与其他规则组合在一起使用,以便仅在其他规则无法生成结果时查询 DNS。
function FindProxyForURL(url, host) { if (isPlainhost name(host) || dnsDomainIs(host, ".mydomain.com") || isResolvable(host)) return "DIRECT"; else return "PROXY proxy.mydomain.com:8080"; }
在本例中,给定子网中的所有主机将直接进行连接,而其他主机则要经过代理。
function FindProxyForURL(url, host) { if (isInNet(host, "198.95.0.0", "255.255.0.0")) return "DIRECT"; else return "PROXY proxy.mydomain.com:8080"; }
在本例中,可以通过在开头添加冗余规则来最大程度地减少对 DNS 的使用:
function FindProxyForURL(url, host) { if (isPlainhost name(host) || dnsDomainIs(host, ".mydomain.com") || isInNet(host, "198.95.0.0", "255.255.0.0")) return "DIRECT"; else return "PROXY proxy.mydomain.com:8080"; }
本例较为复杂。它使用四个代理服务器,其中一个充当其他服务器的热备份。如果其余三个代理服务器中的任何一个出现故障,则第四个服务器将进行接管。其余三个代理服务器基于 URL 模式分担负载,从而使它们的高速缓存变得更加有效。任何文档在这三个服务器上都只有一个副本,而不是在其中每一个服务器上均有一个副本。分配负载如下表所示。
表 17–3 平衡代理负载
代理 |
用途 |
---|---|
#1 |
.com 域 |
#2 |
.edu 域 |
#3 |
其他所有域 |
#4 |
热备份 |
所有本地访问均应为直接访问。所有代理服务器都在端口 8080 上运行。您可以使用 + 运算符来串联字符串。
function FindProxyForURL(url, host) { if (isPlainhost name(host) || dnsDomainIs(host, ".mydomain.com")) return "DIRECT"; else if (dnsDomainIs(host, ".com")) return "PROXY proxy1.mydomain.com:8080; " + "PROXY proxy4.mydomain.com:8080"; else if (dnsDomainIs(host, ".edu")) return "PROXY proxy2.mydomain.com:8080; " + "PROXY proxy4.mydomain.com:8080"; else return "PROXY proxy3.mydomain.com:8080; " + "PROXY proxy4.mydomain.com:8080"; }
本例与示例 5:使用 dnsDomainIs()() 平衡代理负载基本相同,但本例使用的是 shExpMatch()(),而不是 dnsDomainIs()()。
function FindProxyForURL(url, host) { if (isPlainhost name(host) || dnsDomainIs(host, ".mydomain.com")) return "DIRECT"; else if (shExpMatch(host, "*.com")) return "PROXY proxy1.mydomain.com:8080; " + "PROXY proxy4.mydomain.com:8080"; else if (shExpMatch(host, "*.edu")) return "PROXY proxy2.mydomain.com:8080; " + "PROXY proxy4.mydomain.com:8080"; else return "PROXY proxy3.mydomain.com:8080; " + "PROXY proxy4.mydomain.com:8080"; }
可以设置代理,使其用于特定的协议。在 FindProxyForURL()() 函数中,可以使用大多数标准 JavaScript 功能。例如,要根据协议设置不同的代理,可以使用 substring()() 函数。
function FindProxyForURL(url, host) { if (url.substring(0, 5) == "http:") { return "PROXY http-proxy.mydomain.com:8080"; } else if (url.substring(0, 4) == "ftp:") { return "PROXY ftp-proxy.mydomain.com:8080"; } else if (url.substring(0, 7) == "gopher:") { return "PROXY gopher-proxy.mydomain.com:8080"; } else if (url.substring(0, 6) == "https:" || url.substring(0, 6) == "snews:") { return "PROXY security-proxy.mydomain.com:8080"; } else { return "DIRECT"; } }
使用 shExpMatch()() 函数也可以实现此配置;例如:
... if (shExpMatch(url, "http:*")) { return "PROXY http-proxy.mydomain.com:8080; } ...