Sun Java System Web Proxy Server 4.0.1 管理指南 |
第 17 章
使用用戶端自動配置檔案如果您擁有支援許多用戶端的多個 Proxy Server,您可以使用用戶端自動配置檔案來配置所有的瀏覽器用戶端。自動配置檔案包含一個 JavaScript 函數,可決定在存取不同的 URL 時,瀏覽器使用哪一個代理伺服器。
當瀏覽器啟動時會載入自動配置檔案。每當使用者按一下一個連結或鍵入一個 URL,瀏覽器會使用配置檔來決定它是否應該使用代理伺服器,以及如果決定使用,應該使用哪個代理伺服器。利用此功能可以輕鬆配置組織中所有的瀏覽器實例。有幾種方式可以讓您向用戶端提供自動配置檔案。
- 您可以使用代理伺服器做為傳回自動配置檔案的 Web 伺服器。您將瀏覽器指向代理伺服器的 URL。若讓代理伺服器充當 Web 伺服器,可以將自動配置檔案保存在某個地方,當您需要更新時,您只需要變更一個檔案即可。
- 您可以在 Web 伺服器、FTP 伺服器或是瀏覽器能夠存取的任何網路目錄中儲存此檔案。配置瀏覽器時將檔案的 URL 提供給瀏覽器,使其能夠找到檔案,就像任何一般的 URL 那樣。如果您需要執行複雜的計算 (例如,如果您的組織中有大型的代理鏈接),可以編寫一個 Web 伺服器 CGI 程式,視存取檔案的使用者而輸出不同的檔案。
- 您可以在本機中將自動配置檔案與瀏覽器的每個副本一起儲存;但是如果您需要更新檔案,則必須將檔案的副本分發給每個用戶端。
您可以透過下列兩種方式建立自動配置檔案:可使用 Server Manager 中的頁面,或是手動建立檔案。建立檔案的指示在本章的稍後會加以說明。
本章包含下列小節:
瞭解自動配置檔案本功能記載於此手冊中的原因是身為 Proxy Server 管理人員的您也會建立與分發用戶端自動配置檔案。
自動配置檔案做些什麼
自動配置檔案是以 JavaScript 編寫的,它是一種簡潔的、基於物件的程式檔語言,用於開發用戶端與伺服器網際網路應用程式。瀏覽器可解譯 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.d omain: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] 連結。出現的頁面會列出代理伺服器系統中現有的任何自動配置檔案。您可按一下自動配置檔案對其進行編輯。其餘的步驟會告訴您如何建立新檔案。
- 鍵入做為 URL 路徑部分的可選 URI,用戶端從代理伺服器取得自動配置檔案時會使用它。例如,鍵入 / 讓用戶端將檔案做為代理伺服器的主要文件 (類似 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 在使用者只指定電腦名稱時直接移至伺服器。例如,如果內部 Web 伺服器名為 winternal.mysite.com,使用者可能只鍵入 http://winternal,而不鍵入完全合格的網域名稱。在這種情況下,Navigator 會直接移至 Web 伺服器,而不會移至代理伺服器。
- Connecting To A Host In Domain 可讓您指定最多三個 Navigator 可直接存取的網域名稱。指定網域時,請以點字元做為開頭。例如,您可鍵入 .example.com。
- Connecting To A Resolvable Host 讓 Navigator 在用戶端能夠解析主機時直接移至伺服器。通常在 DNS 設為只解析本機 (內部) 主機時使用此選項。用戶端會在連接至本機網路外部的伺服器時,使用代理伺服器。
- Connecting To A Host In Subnet 讓 Navigator 在用戶端存取特定子網路中的伺服器時,直接移至伺服器。此選項適用於當某個組織在某個地區有許多子網路時。例如,某些公司可能將它的一個網域名稱用於全世界的子網路,而每個子網路均專屬於某個特定的區域。
- 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 編寫而成。每個檔案包含一個 JavaScript 函數 (稱為 FindProxyForURL),用以決定瀏覽器應對每個 URL 使用哪個代理伺服器 (如果有的話)。瀏覽器會為 JavaScript 函數傳送兩個參數:目標原始伺服器的主機名稱以及其嘗試取得的 URL。JavaScript 函數會傳回一個值給 Navigator,告訴它如何繼續。下節將描述函數的語法以及可能傳回的值。
FindProxyForURL 函數
FindProxyFor URL 函數的語法如下:
function FindProxyForURL(url, host)
{
...
}瀏覽器存取每個 URL 時,都會傳送 url 和 host 參數並且以下列方式呼叫函數:
ret = FindProxyForURL(url, host);
url 為在瀏覽器中被存取的完整 URL。
host 為從正被存取的 URL 所擷取的主機名稱。這樣僅是為了方便起見;它與 :// 和其後的第一個 : 或 / 之間的字串相同。此參數中不包括連接埠號。它可以依據需要從 URL 擷取。
ret (傳回值) 為描述配置的字串。
函數傳回值
自動配置檔案包含函數 FindProxyForURL。此函數使用用戶端主機名稱以及其存取的 URL 做為參數。函數將傳回一個字串,告訴瀏覽器如何繼續進行。如果字串為空值,則不能使用任何代理伺服器。字串可以包含如表 17-2 中所示任何數目的建構區段,以分號分隔。
如果瀏覽器遇到無法使用的代理伺服器,瀏覽器會在 30 分鐘後自動重試先前未回應的代理伺服器,接著在一小時後再試,以 30 分鐘為間隔依此類推。這意味著如果您暫時關閉了代理伺服器,用戶端在啟動後的 30 分鐘以內將會繼續使用代理伺服器。
如果所有代理伺服器都已當機,而且未指定 DIRECT 傳回值,瀏覽器將會詢問使用者是否應該暫時忽略代理伺服器而嘗試採用直接連線。在 20 分鐘後,Navigator 將會詢問是否應該重試代理伺服器,接著在下一個 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 有數個預先定義的函數與環境條件,在您使用代理時非常有用。每個函數都會檢查是否有符合特定條件,然後會傳回 True 或 False 值。相關的公用程式函數是一個例外,原因是它們會傳回一個 DNS 主機名稱或 IP 位址。您可以在主要的 FindProxyForURL 函數中使用這些函數來決定傳送給瀏覽器的傳回值。有關這些函數的特定使用方法,請參閱本章稍後的範例。
每個函數或環境條件在本節中均會說明。適用於瀏覽器與代理伺服器整合的函數或環境條件為:
基於主機名稱的函數:
相關公用程式函數:
基於 URL/主機名稱的條件:
基於時間的條件:
基於主機名稱的函數
基於主機名稱的函數可讓您使用主機名稱或 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 中的主機名稱是一般的主機名稱還是完全合格的網域名稱。如果您希望 Netscape Navigator 直接與本機伺服器連線 (如範例 1:代理除本地主機以外的所有伺服器和範例 2︰ 代理防火牆外的本機伺服器所示),則此函數將非常有用。
參數:
host 為 URL 中的主機名稱 (不包括連接埠號),但條件是主機名稱中沒有網域名稱 (沒有點區段)。
傳回值:
如果 host 為本機則為 true;如果 host 為遠端則為 false
範例:
isPlainhost name("host")
如果 host 類似 www,則會傳回 true;如果主機類似 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")
returns 0。
dnsDomainLevels("www.example.com")
returns 2。
dnsResolve(host)
dnsResolve() 函數解析給定主機的 IP 位址 (通常是從 URL)。如果 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 DECyear 是一個四位數字的整數,代表年度 (例如 1996 年)。
gmt 或者為字串 GMT (以格林威治標準時間進行時間比較),或者保留空白 (假設時間處於當地時區)。GMT 參數可以在任何呼叫設定檔中指定,始終做為最後一個參數。如果只指定一個值 (從每個類別:day, month, year),函數只有在與指定值相符的日期才會傳回 true 值。如果指定了兩個值,從第一個指定的時間到第二個指定的時間這一範圍內,結果皆為 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 點)
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 SATgmt 或者為 GMT (代表格林威治標準時間) 或者保留空白 (代表當地時間)。
只有第一個參數 wd1 是必須要有的。wd2 或 gmt (或兩者) 可以留空。
如果只有一個參數出現,函數會在參數代表的星期幾傳回 true 值。如果字串 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 的代理伺服器。
範例 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 皆能執行。特別要注意 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";
elsereturn "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 中所示。
所有本機存取應為直接存取。所有代理伺服器都在連接埠 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;
}...