Sun Java System Web Proxy Server 4.0.8 管理指南

函数示例

本节提供详细的 JavaScript 函数示例。

示例 1:代理除本地主机之外的所有服务器

在本例中,浏览器直接连接到非全限定的所有主机以及本地域中的主机。所有其他主机均要经过名为 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";
    }

示例 2:代理防火墙外部的本地服务器

本例类似于示例 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.commerchant.example.com 也要经过代理。

指定适当的例外情况顺序可以提高效率:localHostOrDomainIs()() 函数仅对本地域中的 URL 才会执行,而不是对于每个 URL 都要执行。请特别留意 and 表达式之前的 or 表达式两边的括号。

示例 3:仅代理未解析的主机

本例适用于内部 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";
    }

示例 4:直接连接到子网

在本例中,给定子网中的所有主机将直接进行连接,而其他主机则要经过代理。

    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";
    }

示例 5:使用 dnsDomainIs()() 平衡代理负载

本例较为复杂。它使用四个代理服务器,其中一个充当其他服务器的热备份。如果其余三个代理服务器中的任何一个出现故障,则第四个服务器将进行接管。其余三个代理服务器基于 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";
}

示例 6:使用 shExpMatch()() 平衡代理负载

本例与示例 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";
    }

示例 7:代理特定协议

可以设置代理,使其用于特定的协议。在 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;
    }
    ...