使用客户机自动配置文件

使用客户机自动配置文件

如果有多个代理服务器支持众多客户机,可以使用客户机自动配置文件来配置所有浏览器客户机。自动配置文件包含一个 JavaScript 函数,该函数用于确定访问各种 URL 时浏览器所使用的代理服务器(如果有)。

浏览器会在启动时加载自动配置文件。每当用户单击 URL 链接或类型时,浏览器都会使用该配置文件来确定是否应使用代理服务器,若如此,还要确定应使用哪个代理服务器。利用此特性,可以快速配置组织中的所有浏览器实例。可以采用多种方式向客户机提供自动配置文件。

    • 可将代理服务器用作返回自动配置文件的 Web 服务器。将浏览器指向代理服务器的 URL。通过使代理服务器担当 Web 服务器,可将自动配置文件保存在一个地方,这样,当需要进行更新时,只需更改一个文件即可。
    • 可在 Web 服务器、FTP 服务器或是浏览器有权访问的任何网络目录上存储该文件。通过向浏览器提供该文件的 URL 来配置浏览器,使其可以找到该文件,因而可以使用任何常规的 URL。如果需要执行复杂计算(例如,如果组织中存在大型代理链),可以编写一个 Web 服务器 CGI 程序,根据该文件的具体访问者输出不同的文件。
    • 可将自动配置文件与每个浏览器副本一起存储在本地;但是,如果需要更新该文件,则须将该文件的副本分发给每个客户机。

创建自动配置文件可以采用两种方式:可使用 Server Manager 中的页面,也可手动创建该文件。本章后面提供有创建此类文件的指示说明。

本章包括以下各节:


了解自动配置文件

将此特性放在本书进行记述的原因是,作为管理 Proxy Server 的人员,您很有可能也会创建和分发客户机自动配置文件。

自动配置文件的作用

自动配置文件的编写语言是 JavaScript,它是一种基于对象的小型脚本语言,用于开发客户机和服务器 Internet 应用程序。浏览器负责对 JavaScript 文件进行解释。

浏览器会在首次加载时下载自动配置文件。可将该文件保存在浏览器使用 URL 可以访问到该文件的任何位置。例如,可将该文件保存在 Web 服务器上。倘若浏览器可以使用 file:// URL 访问到该文件,甚至可以将其保存在网络文件系统上。

代理配置文件是用 JavaScript 编写的。该 JavaScript 文件定义了单个函数(称为 FindProxyForURL),用于确定浏览器应对每个 URL 使用的代理服务器(如果有)。浏览器会向该 JavaScript 函数发送两个参数:浏览器运行所在系统的主机名以及浏览器想要获取的 URL。该 JavaScript 函数会向浏览器返回一个值,告知它该如何继续执行。

利用自动配置文件可以针对各种类型的 URL、各种服务器甚至是一天的各个时间,指定不同的代理服务器(或根本不指定任何代理服务器)。换言之,可以有多个专门的代理服务器,例如,可使一个提供 .com 域服务,使另一个提供 .edu 域服务,而使再一个提供其他一切服务。这样即可将负载分开并提高代理服务器磁盘的使用效率,因为任何文件在高速缓存中均只有一个副本(而不是所有代理服务器全都存储相同的文档)。

自动配置文件还支持代理服务器故障转移,因此,如果某个代理服务器不可用,浏览器会透明地切换到另一个代理服务器。

以 Web 服务器形式访问代理服务器

可在代理服务器上存储一个或多个自动配置文件,并使代理服务器充当 Web 服务器,对于后者,自动配置文件是其仅有的文档。这样,代理服务器管理员即可维护组织中客户机所需的代理自动配置文件。还可以将这些文件保存在一个中心位置,如此一来,如果必须更新这些文件,则只需更新一次,所有浏览器客户机都会自动获得更新。

将代理自动配置文件保存在 server- root/proxy-serverid/pac/ 目录中。在浏览器中输入代理自动配置文件的 URL,为此,只需在 "Proxies" 选项卡中键入该文件的 URL 即可。代理服务器的 URL 具有以下格式:

http://proxy.domain:port/URI

例如,URL 可以是 http://proxy.example.com。无需指定 URI(跟在 host:port 组合后面的 URL 部分);但是,如果确要使用 URI,则可使用模板控制对各个自动配置文件的访问。例如,如果创建一个称为 /test 的 URI,其中含有一个称为 /proxy.pac 的自动配置文件,则可创建一个资源模式为http://proxy.mysite.com:8080/test/.* 的模板。然后,可以使用该模板具体设置对该目录的访问控制。

可创建多个自动配置文件,并通过不同的 URL 对其进行访问。表 17-1 列出了一些示例 URI 以及客户机对其进行访问时将会使用的 URL。

表 17-1 样例 URI 及相应的 URL

URI(路径)

代理服务器的 URL

/

http://proxy.mysite.com

/employees

http://proxy.mysite.com/employees

/group1

http://proxy.mysite.com/group1

/managers

http://proxy.mysite.com/managers

对反向代理服务器使用 Pac 文件

鉴于反向代理服务器的工作方式,可能很难使代理服务器既担当反向代理服务器又为 .pac 文件提供服务。这是因为代理服务器在获得文件请求后,需要确定所请求的是本地 .pac 文件还是远程文档。

要使代理服务器在维护和服务于 .pac 文件之外还担当反向代理服务器,需要手动编辑 obj.conf 文件,以确保各 NameTrans 函数的顺序正确无误。

通过创建正则映射可使代理服务器担当反向代理服务器。这通常会示意代理服务器将所有请求路由至远程内容服务器。可添加代理自动配置文件,并将其映射到特定目录,如 /pac。在此情况下,任何要获取 .pac 文件的客户机都将使用如下的 URL:

http://proxy.mysite.com/pac


注意

但是,对于此映射,必须确保远程内容服务器没有类似的目录。


编辑 obj.conf 文件,以确保代理自动配置文件的指令和函数出现在其他任何映射之前。此类指令和函数必须最先出现,因为代理服务器在为请求提供服务之前,通常要先运行所有的 NameTrans 函数。然而,使用自动配置文件,代理服务器可立即识别路径并返回 .pac 文件。

以下是 obj.conf 文件的一个示例,它使用了反向代理服务器并维护着一个自动配置文件:

<Object name="default">
NameTrans from="file:" fn="map" to="ftp:"
NameTrans from="/pac" fn="pac-map" name="file" to="/ns-home/proxy/pac/proxy.pac"
NameTrans fn="redirect" from="http://foo.*" url="http://www.acme.com"
NameTrans from="/ns-icons" fn="pfx2dir" dir="/ns-home/ns-icons" name="file"
NameTrans fn="reverse-map" from="http://web.acme.com" to="http://proxy.acme.com:8080"
NameTrans fn="map" from="http://proxy.acme.com:8080" to="http://web.acme.com"
NameTrans fn="map" from="/" to="http://web.acme.com"
PathCheck fn="url-check"
Service fn="deny-service"
AddLog fn="flex-log" name="access"
AddLog fn="urldb-record"
</Object>


使用 Server Manager 页面创建自动配置文件

使用 Server Manager 页面创建自动配置文件
    • 访问 Server Manager,然后选择 "Routing" 选项卡。
    • 单击 "Create/Edit Autoconfiguration File" 链接。出现一个页面,其中列出了代理服务器系统上现有的任何自动配置文件。您可以单击自动配置文件对其进行编辑。余下的步骤将介绍如何创建新文件。
    • 键入客户机从代理服务器获取自动配置文件时使用的可选 URI,它是 URL 的路径部分。例如,键入 / 可使客户机以代理服务器主文档(类似于 Web 服务器的index.html 文件)形式访问该文件,此时,客户机在访问代理服务器的自动配置文件时将只使用域名。可以使用多个 URI,并分别为各个 URI 创建自动配置文件。
    • 键入自动配置文件的名称,使用 .pac 扩展名。如果只有一个文件,可将其简单称为 proxy.pac(pac 是 proxy autoconfiguration(代理自动配置)的缩写)。所有自动配置文件都是含有单个 JavaScript 函数的 ASCII 文本文件。
    • 单击 "OK"。出现另一个页面。使用此页面创建自动配置文件。客户机按顺序完成此页面上的各项。此页面上的项目包括:
    • Never Go Direct To Remote Server 示意 Navigator 始终使用您的代理服务器。可以指定一个辅助代理服务器,以便在您的代理服务器未运行时使用。
    • Go Direct To Remote Server When 可在某些情况下绕过代理服务器。Navigator 按照以下选项在此页面上的列出顺序确定各种情况:
      • Connecting To Non-fully Qualified Host Names 示意 Navigator 在用户仅指定计算机名时直接转至服务器。例如,如果有一台称为winternal.mysite.com 的内部 Web 服务器,用户可以只键入 http://winternal,而不用键入全限定域名。在这种情况下,Navigator 直接转至 Web 服务器而非代理服务器。
      • Connecting To A Host In Domain 允许指定多达三个 Navigator 可以直接访问的域名。指定域名时应以园点字符开头。例如,可键入.example.com
      • Connecting To A Resolvable Host 使 Navigator 在客户机可以解析主机时直接转至服务器。通常在将 DNS 设置为仅解析本地(内部)主机时使用此选项。连接本地网络之外的服务器时,客户机可以使用代理服务器。

        注意

        上述选项使客户机在每次请求时都询问 DNS。因而对性能造成负面影响,并体现在客户机上。由于性能影响,应避免使用此选项。


      • Connecting To A Host In Subnet 使 Navigator 在客户机访问特定子网中的服务器时直接转至该服务器。如果某组织在某个地理区域内分布许多子网,此选项会很有用。例如,某些公司可能只有一个域名,该域名适用于世界范围的各个子网,但每个子网均为某个特定区域所专有。

        注意

        上述选项使客户机在每次请求时都询问 DNS。因而对性能造成负面影响,并体现在客户机上。由于性能影响,应避免使用此选项。


      • Except When Connecting To Hosts 允许指定对于直接转至服务器规则的例外情况。例如,如果键入 .example.com 作为要直接转到的域,可以将转至home.example.com 作为例外情况处理。这会示意 Navigator 在转至 home.example.com 时使用您的代理服务器,但直接转至 example.com 域中的其他任何服务器。
      • Secondary Failover Proxy 用于指定一个辅助代理服务器,以便在您的代理服务器未运行时使用。
      • Failover Direct 示意 Navigator 在您的代理服务器未运行时直接转至这些服务器。如果指定辅助故障转移代理服务器,Navigator 会在直接转至服务器前先试用辅助代理服务器。
    • 单击 "OK" 创建自动配置文件。该文件存储在 server-root/proxy-serverid/pac 目录中。您将得到一条确认消息,说明该文件已正确创建。重复上述步骤,创建所需数量的自动配置文件。

创建了自动配置文件后,确保告诉所有使用您代理服务器的人员指向正确的自动配置文件,或亲自配置 Navigator 的各个副本。


手动创建自动配置文件

本节介绍如何手动创建自动配置文件。

代理自动配置文件是用客户端 JavaScript 编写的。每个文件均含有单个称为 FindProxyForURL 的 JavaScript 函数,用于确定浏览器应对每个 URL 使用的代理服务器(如果有)。浏览器会向该 JavaScript 函数发送两个参数:目标起始服务器的主机名以及浏览器想要获取的 URL。该 JavaScript 函数会向 Navigator 返回一个值,告知它该如何继续执行。下节将介绍函数语法和可能的返回值。

FindProxyForURL 函数

FindProxyFor URL 函数的语法如下:

function FindProxyForURL(url, host)
{
   ...
}

浏览器访问每个 URL 时,都会发送 url 和 host 参数并采用以下方式调用该函数:

ret = FindProxyForURL(urlhost);

url 是正在浏览器中访问的完整 URL。

host 是从正在访问的 URL 中提取的主机名。这样做仅仅是为了方便;它与 :// 和其后的第一个 : 或 / 之间的字符串相同。此参数中不包括端口号。可根据需要从 URL 中提取它。

ret(返回值)是一个用于描述配置的字符串。

函数返回值

自动配置文件含有函数 FindProxyForURL。此函数使用客户机主机名和所访问的 URL 作为参数。该函数会返回单个字符串,告知浏览器该如何继续执行。如果该字符串为空值,则不能使用任何代理服务器。该字符串可以包含表 17-2 所示的任意数目的组块,其间以分号隔开。

表 17-2 FindProxyForURL 返回值

返回值

结果发生的浏览器操作

DIRECT

不经过任何代理服务器直接与服务器进行连接。

PROXYhost:port

使用指定的代理服务器和端口号。如果有多个以分号隔开的值,则使用第一个代理服务器。如果该代理服务器失败,则使用下一个代理服务器,依此类推。

SOCKShost:port

使用指定的 SOCKS 服务器。如果有多个以分号隔开的值,则使用第一个代理服务器。如果该代理服务器失败,则使用下一个代理服务器,依此类推。

如果浏览器遇到不可用的代理服务器,浏览器将在 30 分钟后自动重试先前无响应的代理服务器,一个小时后会再次进行尝试,依此类推,每次间隔时间为 30 分钟。这意味着,如果暂时关闭代理服务器,客户机至多在其重新启动后 30 分钟便会重新开始使用该代理服务器。

如果所有代理服务器均停用且未指定 DIRECT 返回值,浏览器将询问用户是否暂时忽略代理服务器而尝试直接进行连接。Navigator 将询问是否应在 20 分钟后重试代理服务器,接着过 20 分钟会再次询问,依此类推,每次间隔时间为 20 分钟。

在下例中,返回值告知浏览器使用端口 8080 上称为 w3proxy.example.com 的代理服务器,但如果该代理服务器不可用,浏览器将使用端口 8080 上称为proxy1.example.com 的代理服务器:

PROXY w3proxy.example.com:8080; PROXY proxy1.example.com:8080

在下一个示例中,主代理服务器为 w3proxy.example.com:8080;如果该代理服务器不可用,浏览器将使用 proxy1.example.com:8080。如果两个代理服务器均不可用,则浏览器将直接转至服务器(过 20 分钟,浏览器会询问用户是否应重试第一个代理服务器):

PROXY w3proxy.example.com:8080; PROXY proxy1.example.com:8080; DIRECT

JavaScript 函数与环境

JavaScript 有多个预定义的函数和环境条件,它们对于执行代理很有用。这些函数中的每一个均会检查是否满足某个特定条件,然后返回一个真值或假值。相关的实用程序函数例外,因为他们返回的是 DNS 主机名或 IP 地址。可在主 FindProxyForURL 函数中使用这些函数来确定要发送给浏览器的返回值。有关这些函数的具体使用方法,参见本章后面的示例。

本节将对每个函数或环境条件进行介绍。适用于浏览器与代理服务器集成的函数和环境条件有:

基于主机名的函数

    • dnsDomainIs()
    • isInNet()
    • isPlainhost name()
    • isResolvable()
    • localHostOrDomainIs()

相关的实用程序函数:

    • dnsDomainLevels()
    • dnsResolve()
    • myIpAddress()

基于 URL/主机名的条件:

    • shExpMatch()

基于时间的条件:

    • dateRange()
    • timeRange()
    • weekdayRange()
基于主机名的函数

通过基于主机名的函数,可以使用主机名或 IP 地址来确定要使用的代理服务器(如果有)。

dnsDomainIs(host, domain)

dnsDomainIs() 函数检测 URL 主机名是否属于给定的 DNS 域。如示例 1:代理除本地主机外的所有服务器示例 2:代理防火墙外面的本地服务器中所示,当您要将浏览器配置成不对本地域使用代理服务器时,此函数很有用。

在某些情况下会基于 URL 所属的 DNS 域从一组代理服务器中选择接收请求的代理服务器,当您在这些情况下使用多个代理服务器进行负载平衡时,此函数也很有用。例如,如果负载平衡方式是将含有 .edu 的 URL 定向到一个代理服务器,而将含有 .com 的那些 URL 定向到另一个代理服务器,则可以使用 dnsDomainIs()来检查 URL 主机名。

参数:

host 是 URL 中的主机名。

domain 是用以测试主机名的域名。

返回值:

true 或 false

示例:

以下语句将为 true:

dnsDomainIs("www.example.com", ".example.com")

以下语句将为 false:

dnsDomainIs("www", ".example.com") 
dnsDomainIs("www.mcom.com", ".example.com")

isInNet(host, pattern, mask)

利用 isInNet() 函数可将 URL 主机名解析为 IP 地址,并测试其是否属于掩码所指定的子网。这与 SOCKS 所使用的 IP 地址模式匹配属于同一类型。参见示例 4:直接连接到子网

参数:

host 为 DNS 主机名或 IP 地址。如果传递的是主机名,此函数会将其解析成 IP 地址。

pattern 是点分隔格式的 IP 地址模式

mask 为 IP 地址模式掩码,用于确定应对 IP 地址的哪些部分进行匹配。值为 0 表示忽略;255 表示匹配。如果主机的 IP 地址与指定的 IP 地址模式匹配,则此函数为 true。

返回值:

true 或 false

示例:

仅当主机的 IP 地址与 198.95.249.79 完全匹配时,此语句才为 true:
isInNet(host, "198.95.249.79", "255.255.255.255")

仅当主机的 IP 地址与 198.95.*.* 匹配时,此语句才为 true:
isInNet(host, "198.95.0.0", "255.255.0.0")

isPlainhost name(host)

isPlainhost name() 函数检测所请求 URL 中的主机名是普通主机名还是全限定域名。如示例 1:代理除本地主机外的所有服务器示例 2:代理防火墙外面的本地服务器中所示,如果要将 Netscape Navigator 直接连接到本地服务器,则此函数很有用。

参数:

host 为 URL 中的主机名(不包括端口号),只要该主机名不含域名(无带点段)。

返回值:

如果 host 是本地的,则为 true;如果 host 是远程的,则为 false

示例:

isPlainhost name("host")

如果 host 形如 www,则返回 true;如果 host 形如 www.example.com,则返回 false。

isResolvable(host)

如果防火墙内的 DNS 仅识别内部主机,则可使用 isResolvable() 函数来测试主机名相对于网络是内部的还是外部的。使用此函数,可将浏览器配置成对内部服务器使用直接连接,而仅对外部服务器使用代理服务器。在一些站点,防火墙内的内部主机能够解析其他内部主机的 DNS 域名,但所有外部主机均不可解析,对于此类站点,此函数将很有用。isResolvable() 函数通过询问 DNS 尝试将主机名解析成 IP 地址。参见示例 3:仅代理未解析的主机

参数:

host 是 URL 中的主机名。此函数会尝试解析该主机名,并在成功时返回 true。

返回值:

如果能解析主机名,则为 true;如果不能,则为 false

示例:

isResolvable("host")

如果 host 形如 www 并且可通过 DNS 进行解析,则此函数返回 true。

localHostOrDomainIs(host, hostdom)

localHostOrDomainIs() 函数指定可以通过全限定域名或普通主机名访问的本地主机。参见示例 2:代理防火墙外面的本地服务器

如果主机名与指定的主机名完全匹配,或者在主机名中没有与非限定主机名匹配的域名部分,则 localHostOrDomainIs() 函数返回 true

参数:

host 是 URL 中的主机名。

hostdom 是要匹配的全限定主机名。

返回值:

true 或 false

示例:

以下语句为 true(完全匹配):

localHostOrDomainIs("www.example.com", "www.example.com")

以下语句为 true(主机名匹配,未指定域名):

localHostOrDomainIs("www", "www.example.com")

以下语句为 false(域名不匹配):

localHostOrDomainIs("www.mcom.com", "www.example.com")

以下语句为 false(主机名不匹配):

localHostOrDomainIs("home.example.com", "www.example.com")

相关的实用程序函数

利用相关的实用程序函数,可以查明域层级、运行 Netscape Navigator 的主机,或主机的 IP 地址。

dnsDomainLevels(host)

dnsDomainLevels() 函数查找 URL 主机名中的 DNS 层数(圆点数)。

参数:

host 是 URL 中的主机名。

返回值:

DNS 域层数(整数)。

示例:

dnsDomainLevels("www")

返回 0。

dnsDomainLevels("www.example.com")

返回 2。

dnsResolve(host)

dnsResolve() 函数解析给定主机(通常来自 URL)的 IP 地址。如果 JavaScript 函数须进行比现有函数所能完成的更高级的模式匹配,则此函数将很有用。

参数:

host 是要解析的主机名。将给定 DNS 主机名解析成 IP 地址,并以点分隔格式的字符串形式将其返回。

返回值:

字符串值形式的点四分 IP 地址

示例:

以下示例将返回字符串 198.95.249.79。

dnsResolve("home.example.com")

myIpAddress()

当 JavaScript 函数须根据运行浏览器的具体主机而采取不同行为时,myIpAddress() 函数将很有用。此函数将返回运行浏览器的那台计算机的 IP 地址。

返回值:

字符串值形式的点四分 IP 地址

示例:

如果在计算机 home.example.com 上运行 Navigator,下例将返回字符串 198.95.249.79。

myIpAddress()

基于 URL/主机名的条件

可通过匹配主机名或 URL 来进行负载平衡和路由选择。

shExpMatch(str, shexp)

shExpMatch() 函数匹配 URL 主机名或 URL 本身。此函数主要用于负载平衡以及指向不同代理服务器的 URL 的智能路由选择。

参数:

str 是要比较的任何字符串(例如,URL 或主机名)。

shexp 是用以进行比较的 shell 表达式。

如果字符串与指定的 shell 表达式匹配,则此表达式为 true。参见示例 6:用 shExpMatch() 平衡代理负载

返回值:

true 或 false

示例:

第一个示例返回 true;第二个返回 false。

shExpMatch("http://home.example.com/people/index.html",
            ".*/people/.*")

shExpMatch("http://home.example.com/people/yourpage/index.html",
            ".*/mypage/.*")

基于时间的条件

可以使 FindProxyForURL 函数根据日期、时间或星期几而采取不同的行为。

dateRange (day, month, year...)

dateRange() 函数检测特定日期或日期范围,如 1996 年 4 月 19 日到 1996 年 5 月 3 日。如果要使 FindProxyForURL 函数视当天日期而执行不同操作(例如,如果为其中一个代理服务器安排了定期停机维护时间),则此函数将很有用。

可采用多种方式指定日期范围:

dateRange(day)
dateRange(day1, day2)
dateRange(mon)
dateRange(month1, month2)
dateRange(year)
dateRange(year1, year2)
dateRange(day1, month1, day2, month2)
dateRange(month1, year1, month2, year2)
dateRange(day1, month1, year1, day2, month2, year2)
dateRange(day1, month1, year1, day2, month2, year2, gmt)

参数:

day 是一个介于 1 到 31 的整数,代表月号。

month 为以下月份字符串之一:
JAN FEB MAR APR MAY JUN JUL AUG SEP OCT NOV DEC

year 是一个四位整数,代表年度(例如,1996)。

gmt 或者为字符串 GMT 或者保留为空,前者将以格林威治标准时间进行时间比较,后者假定时间处于当地时区。可在任何调用配置文件中指定 GMT 参数,不过,它始终都是作为最后一个参数。如果只指定了单个值(对于每个类别:day、month、year),则此函数仅在与指定值匹配的日子才会返回真值。如果指定了两个值,则从指定的第一个时间到指定的第二个时间,结果均为 true。

示例:

以下语句在当地时区每月的第一天为 true。
dateRange(1)

以下语句在格林威治标准时间每月的第一天为 true。
dateRange(1, "GMT")

以下语句对于每月的上半月为 true。
dateRange(1, 15)

以下语句在每年的 12 月 24 日为 true。
dateRange(24, "DEC")

以下语句在 1995 年 12 月 24 日为 true。
dateRange(24, "DEC", 1995)

以下语句在一年的第一季度为 true。
dateRange("JAN", "MAR")

以下语句从每年的 6 月 1 日到 8 月 15 日为 true。
dateRange(1, "JUN", 15, "AUG")

以下语句从 1995 年 6 月 1 日直至 1995 年 8 月 15 日均为 true。
dateRange(1, "JUN", 15, 1995, "AUG", 1995)

以下语句从 1995 年 10 月到 1996 年 3 月为 true。
dateRange("OCT", 1995, "MAR", 1996)

以下语句在 1995 全年均为 true。
dateRange(1995)

以下语句从 1995 年初直至 1997 年末均为 true。
dateRange(1995, 1997)

timeRange (hour, minute, second...)

timeRange 函数检测某一特定日时间或某一时间范围,如晚 9 点到中午 12 点。如果要使 FindProxyForURL 函数视当时具体时间执行不同的操作,则此函数将很有用。

timeRange(hour)
timeRange(hour1, hour2)
timeRange(hour1, min1, hour2, min2)
timeRange(hour1, min1, sec1, hour2, min2, sec2)

参数:

hour 为小时,范围从 0 到 23。(0 表示午夜,23 表示晚上 11:00)

min 为分钟数,范围从 0 到 59。

sec 为秒数,范围从 0 到 59。

gmt 或者是字符串 GMT 或者未指定,前者表示 GMT 时区,后者表示当地时区。对于每一个参数配置文件均可以使用此参数,而且它始终是最后一个参数。

返回值:

true 或 false

示例:

以下语句从正午到下午 1:00 为 true。
timerange(12, 13)

以下语句从 GMT 正午时间到下午 12:59 为 true。
timerange(12, "GMT")

以下语句从上午 9:00 到下午 5:00 为 true。
timerange(9, 17)

以下语句在午夜到午夜过后 30 秒之间为 true。
timerange(0, 0, 0, 0, 0, 30)

weekdayRange(wd1, wd2, gmt)

weekdayRange() 函数检测某一特定星期日期或某一星期日期范围,如星期一到星期五。如果要使 FindProxyForURL 函数视具体星期日期而执行不同的操作,则此函数将很有用。

参数:

wd1 和 wd2 为以下任意一个星期日期字符串:
SUN MON TUE WED THU FRI SAT

gmt 或者是 GMT 或者省略,前者表示格林威治标准时间,后者表示当地时间。

只有第一个参数 wd1 是强制性的。wd2、gmt 中的任一个或两者皆可省略。

如果只有一个参数,则此函数将在该参数所表示的星期日期返回真值。如果指定字符串 GMT 作为第二个参数,则采用 GMT 时间,否则采用当地时区的时间。

如果 wd1 和 wd2 均被定义,则该条件在当前星期日期介于这两个星期日期之间时为 true。首末日期包括在内。参数顺序很重要;"MON," "WED" 指星期一到星期三,而 "WED," "MON" 是从星期三到下周的星期一。

示例:

以下语句从星期一到星期五(当地时区)为 true。
weekdayRange("MON", "FRI")

以下语句从格林威治标准时间星期一到星期五为 true。
weekdayRange("MON", "FRI", "GMT")

以下语句在当地时间星期六为 true。
weekdayRange("SAT")

以下语句在格林威治标准时间星期六为 true。
weekdayRange("SAT", "GMT")

以下语句从星期五到下星期一为 true(顺序很重要)
weekdayRange("FRI", "MON")

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

在本例中,Netscape Navigator 直接连接到所有未完全限定的主机和处于本地域中的主机。其他一切情况均要经过称为 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:代理防火墙外面的本地服务器

本例与上一个示例类似,只是它将对防火墙外面的本地服务器使用代理服务器。如果存在属于本地域而位于防火墙之外的主机(如主 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 都要执行。请特别留意表达式前的表达式周围的括号。

示例 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 所示。

表 17-3 平衡代理负载

代理服务器

用途

#1

.com 域

#2

.edu 域

#3

其他所有的域

#4

热备份

所有本地访问均应为直接访问。所有代理服务器都运行于 8080 端口。可以使用 JavaScript 中的 + 运算符来连接字符串。

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 相同,只不过它使用的是 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:代理特定协议

可以设置代理服务器,使其用于特定的协议。大多数标准 JavaScript 功能都可以在 FindProxyForURL() 函数中使用。例如,要根据协议设置不同的代理服务器,可以使用 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;
  }

  ...


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值