目錄

問題：

問題：

什麼是Proxy Pac檔案？有沒有示例？

環境： 思科網路安全裝置

附註：本知識庫文章所參考的軟體不是由思科維護或支援的。提供此資訊是出於方便的目的。如需更多幫助，請與軟體供應商聯絡。

參考連結：JavaScript或JScript自動代理示例檔案

JavaScript或JScript自動代理示例檔案

下列說明提供如何使用「.pac」檔案指定自動代理 URL 的範例。若要使用這類功能，必須變更代理名稱、連接埠號碼和 IP 位址。

1. isInNet、isResolvable和dnsResolve函式查詢DNS伺服器

2. 對對象模型對象、屬性或方法的引用導致代理自動配置檔案以靜默方式失敗。例如，引用window.open(...)、alert(...)和password(...)都會導致Internet Explorer上的代理自動配置檔案失敗。

範例 1：本地主機直接連線，所有其他主機通過代理連線

以下函式檢查主機名是否為本地主機，如果是，檢查連線是否直接。如果主機名不是本地主機，則連線通過代理（代理）。

函式FindProxyForURL(url，host)

{

if(isPlainHostName(host))

返回"DIRECT";

其他

返回"PROXY proxy:80";

}

isPlainHostName函式檢查主機名中是否有點。如果是，則返回false;否則，該函式返回true。

附註：要直接連線到本地Web伺服器，可能還需要域或子網匹配。並非所有對本地Web伺服器的請求都僅使用主機名完成

範例 2：防火牆內的主機直接連線，外部本地伺服器通過代理連線

以下函式檢查主機是「普通」主機名（表示未包含域名）還是特定域(.company.com)的一部分，但主機名不是www或home。

函式FindProxyForURL(url，host)

{

if((isPlainHostName(host)) ||

dnsDomainIs（主機， "。company.com"）&&

!localHostOrDomainIs(host， "www.company.com")&&

!localHostOrDomainIs(host， "home.company.com"))

返回"DIRECT";

其他

返回"PROXY proxy:80";

}

附註：

- 僅對本地域中的URL執行localHostOrDomainIs函式。

- 如果主機名的域與給定的域匹配，dnsDomainIs函式將返回true。

範例 3:如果主機可解析，請直接連線。否則使用代理連線。

以下函式要求DNS伺服器嘗試解析傳遞給它的主機名。如果可以，則建立直接連線。如果失敗，則透過代理建立連線。當使用內部DNS伺服器解析所有內部主機名時，此功能非常有用。

函式FindProxyForURL(url，host)

{

if(isResolvable(host))

返回"DIRECT";

其他

返回"PROXY proxy:80";

}

請參閱頁面頂部的isResolvable函式的註釋。

範例 4:如果主機位於指定的子網中，請直接連線。否則使用代理連線。

以下函式將給定IP地址模式和掩碼與主機名進行比較。如果子網中的某些主機應直接連線，而其它主機應使用Proxy連線，則此命令非常有用。

函式FindProxyForURL(url，host)

{

if(isInNet(host， "999.99.9", "255.0.255.0"))

返回"DIRECT";

其他

返回"PROXY proxy:80";

}

請參見頁頂部的isInNet函式上的註釋。

如果主機IP地址與指定的模式匹配，isInNet(host， pattern， mask)函式將返回true。遮罩指示IP位址的哪個部分相符(255=match，0=ignore)。

範例 5：根據主機域確定連線型別

如果主機是本地的，則以下函式指定直接連線。如果主機不是本地主機，則此功能根據主機域確定要使用的代理。如果主機域名是代理選擇的條件之一，則此命令非常有用。

函式FindProxyForURL(url，host)

{

if(isPlainHostName(host))

返回"DIRECT";

else if(shExpMatch(host， "*.com"))

返回"PROXY comproxy:80";

else if(shExpMatch(host， "*.edu"))

返回"PROXY eduproxy:80";

其他

返回「代理代理」；

}

如果str使用shell表達式模式匹配shexp，shExpMatch(str， shexp)函式將返回true。

範例 6：根據使用的協定確定連線型別

以下函式提取正在使用的協定並相應地選擇代理。如果在協定上沒有匹配，則建立直接連線。如果使用的協定是代理選擇的標準之一，則此命令非常有用。

函式FindProxyForURL(url，host)

{

if(url.substring(0, 5)== "http:"){

返回"PROXY proxy:80";

}

else if(url.substring(0, 4)== "ftp:"){

返回"PROXY fproxy:80";

}

else if(url.substring(0, 7)== "gopher:"){

返回"PROXY gproxy";

}

else if(url.substring(0, 6)== "https:"){

返回"PROXY secproxy:8080";

}

else {

返回"DIRECT";

}

}

子字串函式從字串中提取指定數量的字元。

範例 7：通過檢查主機名是否與IP地址匹配來確定代理設定

以下函式通過將主機名轉換為IP地址並將其與指定字串進行比較而進行代理選擇。

函式FindProxyForURL(url，host)

{

if(dnsResolve(host)== "999.99.999"){ // = http://proxy

返回"PROXY secproxy:8080";

}

else {

返回"PROXY proxy:80";

}

}

請參閱頁面頂部有關dnsResolve功能的說明。

範例 8：如果主機IP與指定的IP匹配，則通過代理連線，否則直接連線

以下功能是基於指定IP地址進行代理選擇的另一種方式。與示例7不同，此示例使用函式呼叫顯式獲取數字IP地址(示例7使用dnsResolve函式將主機名轉換為數字IP地址)。

函式FindProxyForURL(url，host)

{

if(myIpAddress()== "999.999.99"){

返回"PROXY proxy:80";

}

else {

返回"DIRECT";

}

}

myIpAddress函式返回運行瀏覽器的主機的IP地址（採用整數點格式）。

範例 9：如果主機名中有任何點，則使用代理連線。否則，請直接連線。

以下函式檢查主機名中的點數。如果主機名中有任何點，請通過Proxy建立連線。如果主機名中沒有圓點，請直接連線。這是根據主機名特徵確定連線型別的另一種方法。

函式FindProxyForURL(url，host)

{

如果(dnsDomainLevels(host)> 0){ //如果主機中的點數> 0

返回"PROXY proxy:80";

}

返回"DIRECT";

}

dnsDomainLevels函式返回一個整數，等於主機名中的點數。

範例 10：指定一週內通過代理進行連線的天數，其他天則直接連線

以下函式通過指定適用於代理的一週中的天數來確定連線型別。不在這些引數之間的天數使用直接連線。此功能在流量較大時可能希望使用Proxy以及在流量較小時允許直接連線的情況下非常有用。

函式FindProxyForURL(url，host)

{

if(weekdayRange("WED", "SAT", "GMT"))

返回"PROXY proxy:80";

其他

返回"DIRECT";

}

weekdayRange(day1 [,day2] [,GMT])函式返回當前系統時間是否在引數day1、day2和GMT指定的範圍內。僅需要第一個引數。GMT引數假定時間值處於格林尼治標準時間，而不是本地時區。

範例 11：使用簡單數學函式實現負載均衡

函式FindProxyForURL(url，host){

return randomProxy();

}

function randomProxy()

{

switch(Math.floor(Math.random()*2))

{

案例0:返回「PROXY 1.1.1.1:3128;代理2.2.2.2;PROXY DIRECT;"

案例1:返回「PROXY 2.2.2.2:3128;代理1.1.1.1;PROXY DIRECT;"

}

}

您將看到，這些案例還實施了一個故障切換，以防一個代理不可用。