Sun Java System Web Proxy Server 4.0.4 管理指南

第 17 章 使用用戶端自動配置檔案

若您有支援多個用戶端的多個代理伺服器,可以使用用戶端自動配置檔案來配置所有瀏覽器用戶端。自動配置檔案包含 JavaScript 函數,可決定瀏覽器應該使用哪個代理伺服器 (如果存在) 來存取各種 URL。

瀏覽器啟動時會載入自動配置檔案。每次使用者按一下連結或鍵入 URL 時,瀏覽器會使用配置檔案來判斷是否應該使用代理伺服器;如果答案為是,又要使用哪個代理伺服器。您可以利用這個功能,輕鬆地配置組織中的所有瀏覽器實例。為用戶端提供自動配置檔案的方式有許多種。

您可以使用下列兩種方式的其中一種來建立自動配置檔案:使用 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.domain:port/URI

例如,URL 可能是 http://proxy.example.com,也就是跟隨在 host:port 組合後的 URL 部分。然而若使用 URI,便可以使用範本來控制存取不同自動配置檔案的行為。例如,若建立了名為 /test 的 URI,且其包含名為 /proxy.pac 的自動配置檔案,便可以建立具有資源式樣 http://proxy.mysite.com:8080/test/.* 的範本。接著,您可以使用該範本來設定該目錄專屬的存取控制。

您可以建立多個自動配置檔案,並透過不同的 URL 來存取這些檔案。下表列出一些範例 URI,以及用戶端用來存取這些 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 頁面來建立自動配置檔案

Procedure使用 Server Manager 建立自動配置檔案

  1. 存取 Server Manager,並選取 [Routing] 標籤。

  2. 按一下 [Create/Edit Autoconfiguration File] 連結。

    顯示的頁面中會列出代理伺服器系統上的所有自動配置檔案。您可以按一下自動配置檔案以進行編輯。剩下的步驟會告訴您如何建立新檔案。

  3. 鍵入用戶端從代理伺服器取得自動配置檔案時,將使用的可選用 URI (URL 的路徑部分)。

    例如,鍵入 / 可讓用戶端將該檔案當做代理伺服器的主文件 (類似 Web 伺服器的 index.html 檔案) 存取;往後用戶端存取代理伺服器以取得自動配置檔案時,將只需使用網域名稱。您可以使用多個 URI,並分別為每個 URI 建立自動配置檔案。

  4. 為自動配置檔案鍵入副檔名為 .pac 的名稱。

    若您只有一個檔案,則只要命名為 proxy.pac 即可。pac 為 proxy autoconfiguration (代理伺服器自動配置) 的縮寫。所有自動配置檔案都是具有單一 JavaScript 函數的 ASCII 文字檔。

  5. 按一下 [OK]。此時會顯示另一個頁面。

    用戶端依順序完成頁面上的項目。該頁面上的項目是依用戶端排列。該頁面上的項目如下:

    • Never Go Direct To Remote Server 要求瀏覽器永遠使用您的代理伺服器。您可以指定代理伺服器未執行時,要使用的第二部代理伺服器。

    • Go Direct To Remote Server When 決定何時略過代理伺服器。瀏覽器會以選項列在該頁面上的順序來判斷這些情況:

    • Connecting To Non-fully Qualified Host Names 會在使用者只有指定電腦名稱時,就讓瀏覽器直接存取伺服器。例如,若內部 Web 伺服器的名稱是 winternal.mysite.com,則使用者只需鍵入 http://winternal,而非完全合格的網域名稱。在此情況下,瀏覽器會直接存取 Web 伺服器,而非代理伺服器。

    • Connecting To A Host In Domain 會在用戶端可以解譯主機時,就讓瀏覽器直接存取伺服器。指定網域時,以點字元開頭。例如,您可以鍵入 .example.com

    • Connecting To A Resolvable Host 會在用戶端可以解析主機時,將瀏覽器直接傳送到伺服器。將 DNS 設定成僅解析本地 (內部) 主機時,通常會使用此選項。連線至區域網路外部的伺服器時,用戶端可能會使用代理伺服器。


      注意 – 注意 –

      使用此選項時,用戶端會發現效能受到負面影響,因為用戶端每次發出請求時都必須經過 DNS 查找。


    • Connecting To A Host In Subnet 會在用戶端存取特定子網路內的伺服器時,就讓瀏覽器直接存取伺服器。當組織在某地理區域有許多子網路時,此選項就會非常有用。例如,某些公司可能有一個適用於全球子網路的網域名稱,但每個子網路皆有其特定的區域。


      注意 – 注意 –

      使用此選項時,用戶端會發現效能受到影響,因為用戶端每次發出要求時都必須查閱 DNS。


    • Except When Connecting To Hosts 可讓您指定直接存取伺服器規則的例外。例如,若鍵入 .example.com 做為要直接存取的網域,您可以把存取 home.example.com 當作例外。以後當瀏覽器存取 home.example.com 時會使用您的代理伺服器,但會直接存取 example.com 網域內的其他伺服器。

    • Secondary Failover Proxy 指定代理伺服器未執行時要使用的第二部代理伺服器。

    • Failover Direct 會在您的代理伺服器未執行時,讓瀏覽器直接存取伺服器。若指定了次要容錯移轉代理伺服器,Navigator 在直接存取伺服器之前,會先嘗試使用第二個代理伺服器。

  6. 按一下 [OK] 建立自動配置檔案。

    該檔案會儲存在 server-root/proxy-server id/pac 目錄中。

    此時會顯示確認訊息,通知您已正確建立檔案。重複上述步驟建立所需數量的自動配置檔案。

    建立自動配置檔案之後,請務必要求代理伺服器的所有使用者指向正確的自動配置檔案,或自行配置所有瀏覽器。

手動建立自動配置檔案

本小節說明如何手動建立自動配置檔案。

代理伺服器自動配置檔案是以用戶端 JavaScript 所撰寫。每個檔案都包含一個名為 FindProxyForURL() 的 JavaScript 函數,決定瀏覽器針對各個 URL 使用哪個代理伺服器 (如果存在)。瀏覽器會傳送兩個參數給 JavaScript 函數:目標原始伺服器的主機名稱,以及它嘗試取得的 URL。JavaScript 函數會傳回一個值給 Navigator,告知 Navigator 如何繼續。下節說明函數語法與可能的傳回值。

FindProxyForURL() 函數

FindProxyFor() URL 函數的語法是:

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

對於瀏覽器所存取的每個 URL,它會傳送 urlhost 參數,並以下列方式呼叫函數:

ret = FindProxyForURL(url, host);

url 是要透過瀏覽器存取的完整 URL。

host 是從要存取之 URL 擷取的主機名稱。這只是為了方便;它其實與 :// 與第一個 :或其後 / 之間的字串相同。此參數不包含連接埠號。如果有需要,可以從 URL 擷取。

ret (傳回值) 是說明配置的字串。

函數傳回值

自動配置檔案包含函數 FindProxyForURL()。此函數使用用戶端主機名稱與要存取的 URL 做為參數。此函數會傳回單一字串,告知瀏覽器如何繼續。若該字串為空,則表示不使用任何代理伺服器。該字串可包含下表顯示任何數量的基本元素,每個基本元素以分號分隔。

表 17–2 FindProxyForURL() 傳回值

傳回值 

導致的瀏覽器動作 

DIRECT

直接與伺服器連線,而不透過任何代理伺服器。 

PROXY host:port

使用指定的代理伺服器與連接埠號。若使用分號分隔多個值,則會使用第一個代理伺服器。若該代理伺服器故障,則會使用下一個代理伺服器,以此類推。 

SOCKS host:port

使用指定的 SOCKS 伺服器。若使用分號分隔多個值,則會使用第一個代理伺服器。若該代理伺服器失敗,則會使用下一個代理伺服器,以此類推。 

若瀏覽器遇到無法使用的代理伺服器,瀏覽器會在 30 分鐘後自動重試先前無回應的代理伺服器,然後 1 小時後再重試,以此類推 (重試間隔為 30 分鐘)。因此,若您暫時關閉某個代理伺服器,在該代理伺服器重新啟動後,您的用戶端會在 30 分鐘內繼續使用該代理伺服器。

若所有代理伺服器皆已當機,且未指定 DIRECT 傳回值,瀏覽器將會要求使用者決定是否要讓瀏覽器暫時忽略代理伺服器,而嘗試直接連線。瀏覽器將會詢問是否要在 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 語言具有數個預先定義的函數與環境條件,在使用代理伺服器時非常有用。這些函數都會檢查是否與某特定條件相符,並傳回 true 或 false 值。相關公用程式函數則為例外,因為它們會傳回 DNS 主機名稱或 IP 位址。您可以在主 FindProxyForURL () 函數中使用這些函數,以決定要傳送給瀏覽器的傳回值。本章稍後的範例將提供使用這些函數的方式。

本小節會說明每個函數或環境條件。瀏覽器與代理伺服器整合時適用的函數和環境條件為:

以主機名稱為基礎的函數

以主機名稱為基礎的函數可讓您使用主機名稱或 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:為防火牆外的本地伺服器使用代理伺服器中所述。

參數

host 是來自 URL 的主機名稱,僅在主機名稱沒有網域名稱 (沒有以點分隔的區段) 時排除連接埠號。

傳回值

host 為本機時傳回 true;host 為遠端時傳回 false

範例

isPlainhost name("host")

hostwww 之類的字串,則此函數會傳回 true。若 host 是 www. example.com 之類的字串,則此函數會傳回 false。

isResolvable()(host)

若防火牆內的 DNS 只能識別內部主機,您可以使用 isResolvable()() 函數來測試主機名稱屬於內部網路還是外部網路。透過使用此函數,您可以配置瀏覽器針對內部伺服器使用直接連線,而只針對外部伺服器使用代理伺服器。在防火牆內的內部主機可以解譯其他內部主機的 DNS 網域名稱,但無法解析所有外部主機的站點中,此函數非常有用。isResolvable()() 函數會查閱 DNS,嘗試將主機名稱解析為 IP 位址。請參閱範例 3:只會為無法解譯的主機使用代理伺服器

參數

host() 是來自 URL 的主機名稱。

傳回值

若此函數可以解析主機名稱,會傳回 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")

公用程式函數

您可以使用公用程式函數找出網域層級、執行瀏覽器的主機,或主機的 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 參數也可以指定於任何呼叫設定檔中,它始終做為最後一個參數。若在每個種類 (日、月、年) 中僅指定單一值,則此函數只在與指定值相符的日期傳回 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:00 點。

min 是分鐘,介於 0 到 59 之間。

sec 是秒鐘,介於 0 到 59 之間。

gmt 可以是 GMT 字串 (表示 GMT 時區) 或未指定 (表示本地時區)。此參數可搭配每個參數設定檔使用,而且永遠是最後一個參數。

傳回值

true 或 false

範例:

此敘述在中午到下午 1:00 之間都會傳回 true:timerange(12, 13)

此敘述在中午到下午 12:59 (GMT) 之間都會傳回 true:timerange(12, "GMT")

此敘述在上午 9:00 到下午 5:00 之間都會傳回 true:timerange(9, 17)

此敘述在午夜與午夜過後三十秒之間都會傳回 true:timerange(0, 0, 0, 0, 0, 30)

weekdayRange()(wd1, wd2, gmt)

weekdayRange() 函數會偵測一週內的特定日期或一週內的日期範圍,例如星期一到星期五。若要讓 FindProxyForURL 函數根據星期幾而有不同的運作方式,此函數非常有用。

參數

wd1wd2 皆為下列其中一個星期幾字串:SUN MON TUE WED THU FRI SAT

gmt 可以是 GMT (表示格林威治標準時間) 或未指定 (表示本地時間)。

只有第一個參數 wd1 是必要參數。您可以忽略 wd2gmt,或同時忽略兩者。

若只指定一個參數,此函數在參數所代表的星期幾當天會傳回 true。若將字串 GMT 指定為第二個參數,就會以 GMT 表示時間。否則,會以您的本地時區表示時間。

wd1wd2 皆已定義,而當天介於一週內指定的這兩天之間時,此條件為 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")

函數範例

本小節提供 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()() 平衡代理伺服器的負載相同,但範例 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";
    }

範例 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;
    }
    ...