問題:
什麼是Proxy Pac檔案?是否有任何示例?
環境: 思科網路安全裝置
注意:此知識庫文章引用了思科不維護或支援的軟體。 提供此資訊是為了方便您使用。如需進一步協助,請連絡軟體廠商。
參考連結:JavaScript或JScript Auto-Proxy範例檔案
JavaScript或JScript自動代理示例檔案
下列說明提供如何使用「.pac」檔案指定自動代理 URL 的範例。若要使用這類功能,必須變更代理名稱、連接埠號碼和 IP 位址。
- isInNet、isResolvable和dnsResolve函式查詢DNS伺服器
- 參照物件模型物件、屬性或方法會造成代理自動組態檔案無訊息失敗。例如,參照window.open(...)、alert(...)和password(...)都會導致Internet Explorer上的Proxy自動組態檔失敗。
示例1:本地主機直接連線,所有其他主機透過代理連線
以下函式檢查主機名是否為本地主機,如果是,檢查連線是否為直接連線。如果主機名不是本地主機,則透過代理(代理)進行連線。
函式FindProxyForURL(url, host)
{
if (isPlainHostName(host))
返回「直接」;
其他
返回「PROXY proxy:80";
}
isPlainHostName函式用於檢查主機名中是否存在任何點。如果是,則傳回false;否則,函式傳回true。
注意:對於與本地Web伺服器的直接連線,可能還需要匹配域或子網。並非所有對本地Web伺服器的請求都僅使用主機名完成
示例2:防火牆內部的主機直接連線,外部本地伺服器透過代理連線
以下函式檢查主機是「純」主機名(表示不包含域名)還是特定域(.company.com)的一部分,但主機名不是www或home。
函式FindProxyForURL(url, host)
{
如果((isPlainHostName(host)) ||
dnsDomainIs(主機、「.company.com」)&&
!localHostOrDomainIs(host, "www.company.com") &&
!localHostOrDomainIs(host, "home.company.com")
返回「直接」;
其他
返回「PROXY proxy:80";
}
附註:
- localHostOrDomainIs函式僅針對本地域中的URL執行。
- 如果主機名的域與指定的域匹配,則dnsDomainIs函式返回true。
示例3:如果主機可解析,請直接連線。否則,請使用Proxy連線。
以下函式要求DNS伺服器嘗試解析傳遞給它的主機名。如果可以,則進行直接連線。如果不能,則透過代理建立連線。當使用內部DNS伺服器解析所有內部主機名時,此功能非常有用。
函式FindProxyForURL(url, host)
{
if (isResolvable(host))
返回「直接」;
其他
返回「PROXY proxy:80";
}
請參閱頁面頂端isResolvable函式的註記。
示例4:如果主機位於指定的子網中,請直接連線。否則,請使用Proxy連線。
以下函式將給定的IP地址模式和掩碼與主機名進行比較。如果子網中的某些主機應直接連線,而其它主機應使用代理連線,則此操作很有用。
函式FindProxyForURL(url, host)
{
if (isInNet(host, "999.99.9", "255.0.255.0"))
返回「直接」;
其他
返回「PROXY proxy:80";
}
請參閱頁面頂部isInNet函式的相關註釋。
如果主機IP地址與指定的模式匹配,則isInNet(host, pattern, mask)函式返回true。遮罩會指出IP位址的哪一部分要比對(255=match, 0=ignore)。
示例5:根據主機域確定連線型別
如果主機是本地主機,則以下函式指定直接連線。如果主機不是本地主機,則此功能根據主機域確定要使用的代理。如果主機網域名稱是選擇代理的條件之一,此功能非常有用。
函式FindProxyForURL(url, host)
{
if (isPlainHostName(host))
返回「直接」;
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";
}
其他{
返回「直接」;
}
}
子字串函式會從字串中擷取指定數目的字元。
示例7:透過檢查主機名是否與IP地址匹配來確定代理設定
以下函式透過將主機名轉換為IP地址並將其與指定字串進行比較,進行代理選擇。
函式FindProxyForURL(url, host)
{
if (dnsResolve(host) == "999.99.999") { // = http://proxy
返回「PROXY secproxy:8080";
}
其他{
返回「PROXY proxy:80";
}
}
請參閱頁面頂部有關dnsResolve功能的說明。
示例8:如果主機IP與指定的IP匹配,則透過代理連線,否則直接連線
以下功能是基於指定IP地址進行代理選擇的另一種方式。與示例7不同,此示例使用函式呼叫來明確獲取數字IP地址(示例7使用dnsResolve函式將主機名轉換為數字IP地址)。
函式FindProxyForURL(url, host)
{
if (myIpAddress() == "999.999.99") {
返回「PROXY proxy:80";
}
其他{
返回「直接」;
}
}
myIpAddress函式返回運行瀏覽器的主機的IP地址(採用整數點格式)。
示例9:如果主機名中有任何點,請使用代理進行連線。否則,請直接連線。
以下函式檢查主機名中的點數。如果主機名中有任何點,請透過Proxy建立連線。如果主機名中沒有點,請直接連線。這是根據主機名特徵確定連線型別的另一種方法。
函式FindProxyForURL(url, host)
{
如果(dnsDomainLevels(host) > 0) { //如果主機中的點數> 0
返回「PROXY proxy:80";
}
返回「直接」;
}
dnsDomainLevels函式返回一個整數,等於主機名中的點數。
示例10:指定一週中的哪幾天透過Proxy進行連線,其他日子直接連線
以下函式透過指定適合代理的星期來確定連線型別。不在這些引數之間的天數使用直接連線。如果您想要在流量較大時使用Proxy並在流量較小時允許直接連線,此功能非常有用。
函式FindProxyForURL(url, host)
{
if(weekdayRange(「星期三」、「星期六」、「葛林威治標準時間」))
返回「PROXY proxy:80";
其他
返回「直接」;
}
weekdayRange(day1 [,day2] [,GMT] )函式返回當前系統時間是否在引數day1、day2和GMT指定的範圍內。只需要第一個引數。GMT引數假定時間值為葛林威治標準時間,而不是本地時區。
示例11:使用簡單數學函式執行負載均衡
函式FindProxyForURL(url, host){
return randomProxy();
}
函式randomProxy()
{
switch( Math.floor( Math.random() *2))
{
案例0:返回「PROXY 1.1.1.1:3128;PROXY 2.2.2.2;PROXY DIRECT;」
案例1:返回「PROXY 2.2.2.2:3128;PROXY 1.1.1.1;PROXY DIRECT;」
}
}
您將看到,這些情況還實施故障切換,以防一個代理不可用。