本小節提供 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()() 平衡代理伺服器的負載相同,但範例 5 使用 dnsDomainIs()(),而此範例使用 shExpMatch()()。
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; } ...