自動代理配置腳本示例

附錄 B: 自動代理配置腳本示例

以下十個腳本提供 JavaScript 或 Microsoft® JScript® 的自動代理配置 (.pac) 文件示例。 正如使用自動配置、自動代理和自動檢測中所述,您可以使用 .pac 文件並根據用戶瀏覽器的 URL 請求來自動配置代理。

每個腳本都包括函數 FindProxyForURL(<url>, <host>),其中 <url> 是正在訪問的完整 URL 地址,<host> 指的是從該 URL 提取出的主機名稱。 要使用這些腳本,您必須將佔位符更改爲代理服務器名稱、端口號(通常爲 80)及 IP 地址,以指代組織中實際的名稱、端口號和地址。

noteNote
這些腳本中使用的 isInNetisResolvable 和 dnsResolve 函數會向域名系統 (DNS) 服務器發出查詢請求。

以下是腳本示例的列表:

示例 1: 本地主機直接連接,所有其他主機使用代理連接

以下函數檢查主機名是否是本地主機,如果是,所用的是否爲直接連接。 如果主機名不是本地主機,則通過代理服務器(<proxy>)建立連接。

function FindProxyForURL(url, host)

{

if (isPlainHostName(host))

return "DIRECT";

else

return "PROXY proxy:80";

}

isPlainHostName 函數會檢查主機名中是否包含任何圓點(英文句號)。 如果包含,則返回 false;如果不包含,則返回 true。

示例 2: 防火牆內的主機直接連接,本地服務器外部的主機使用代理連接

以下函數檢查主機名是否是“純”主機名(其中不包含域名)或特定域(如 <.company.com>)的一部分且主機名中不包含文本“www”或“home”。

function FindProxyForURL(url, host)

{

if ((isPlainHostName(host) ||

dnsDomainIs(host, ".company.com")) &&

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

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

return "DIRECT";

else return "PROXY proxy:80";

}

noteNote
只有針對屬於本地域的 URL 才運行 localHostOrDomainIs 函數。 如果主機名的域與給定的域相匹配,則 dnsDomainIs 函數返回 true。

示例 3: 如果主機是可解析的,則直接連接,否則使用代理連接

以下函數請求 DNS 服務器解析傳遞給它的主機名。 如果能夠解析該主機名,則使用直接連接。 如果不能解析主機名,則使用<proxy> 建立連接。 當使用內部 DNS 服務器來解析所有內部主機名時,這種做法非常有用。

function FindProxyForURL(url, host)

{

if (isResolvable(host))

return "DIRECT";

else

return "PROXY proxy:80";

}

noteNote
本腳本中使用的 isResolvable 函數會向 DNS 服務器發出查詢請求。

示例 4: 如果主機位於指定子網內,則直接連接,否則使用代理連接

以下函數將給定的 IP 地址結構和子網掩碼與主機名進行比較。 如果子網內的特定主機需要直接連接,而其他主機需要使用代理進行連接,則這種做法非常有用。

function FindProxyForURL(url, host)

{

if (isInNet(host, "999.99.9.9", "255.0.255.0"))

return "DIRECT";

else

return "PROXY proxy:80";

}

如果<host> IP 地址與給定的<pattern>(如 <999.99.9.9>)相匹配,則 isInNet(<host>, <pattern>, <mask>) 函數返回 true。 <mask>表示 IP 地址應匹配哪個部分(255=匹配,0=忽略)。

noteNote
本腳本中使用的 isInNet 函數會向 DNS 服務器發出查詢請求。

示例 5: 根據主機域決定連接類型

如果是本地主機,則以下函數將指定使用直接連接。 如果不是本地主機,則該函數將根據主機域決定使用哪個代理(<comproxy>、<eduproxy> 或 <proxy>)。 如果在選擇代理時,主機域名是條件之一,則這種做法非常有用。

function FindProxyForURL(url, host)

{

if (isPlainHostName(host))

return "DIRECT";

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

return "PROXY comproxy:80";

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

return "PROXY eduproxy:80";

else

return "PROXY proxy";

}

如果 <str> 與 <shexp> shell 表達式模式匹配,則 shExpMatch(<str>, <shexp>) 函數返回 true。

示例 6: 根據使用的協議決定連接類型

以下函數提取正在使用的協議,並據此作出代理服務器選擇(<proxy>、<fproxy>、<gproxy> 或 <secproxy>)。 如果與協議不匹配,則使用直接連接。 如果在選擇代理時,所使用的協議是條件之一,則這個函數非常有用。

function FindProxyForURL(url, host)

{

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

return "PROXY proxy:80";

}

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

return "PROXY fproxy:80";

}

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

return "PROXY gproxy";

}

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

return "PROXY secproxy:8080";

}

else {

return "DIRECT";

}

}

本示例中的 substring 函數將從字符串的起始處提取指定數目的字符。

示例 7: 通過檢查主機名是否與 IP 地址匹配來決定代理設置

以下函數通過將主機名轉換爲 IP 地址並將其與指定字符串(如 <999.99.99.999>)相比較來選擇代理服務器。

function FindProxyForURL(url, host)

{

if (dnsResolve(host) == "999.99.99.999") { // = http://secproxy

return "PROXY secproxy:8080";

}

else {

return "PROXY proxy:80";

}

}

noteNote
本腳本中使用的 dnsResolve 函數會向 DNS 服務器發出查詢請求。

示例 8: 如果主機 IP 與指定 IP 匹配,則使用代理連接,否則直接連接

以下函數是另一種根據指定 IP 地址來選擇代理的方法。

function FindProxyForURL(url, host)

{

if (myIpAddress() == "999.99.999.99") {

return "PROXY proxy:80"; }

else {

return "DIRECT";

}

}

myIpAddress 函數返回瀏覽器在其上運行的主機的 IP 地址(整數-圓點格式)。 與示例 7 不同,本示例使用函數調用來顯式獲得數字 IP 地址。 (示例 7 使用 dnsResolve 將主機名轉換爲數字 IP 地址。)

示例 9: 如果主機名中包含任何圓點,則使用代理連接,否則直接連接

以下函數會檢查主機名中包含多少個圓點(英文句號)。 如果主機名中包含任何圓點,則瀏覽器將使用<proxy>建立連接。 如果主機名中不包含圓點,則瀏覽器將直接建立連接。 這是另一種根據主機名特徵來確定連接類型的方法。

function FindProxyForURL(url, host)

{

if (dnsDomainLevels(host) > 0) { // if number of dots in host > 0

return "PROXY proxy:80";

}

return "DIRECT";

}

dnsDomainLevels 函數返回一個整數值,代表主機名中包含的圓點數。

示例 10: 指定在一週的哪幾天裏使用代理服務器連接,在其他日期裏則直接連接

以下函數通過指定瀏覽器在一週的哪幾天裏使用代理服務器(<proxy>)來確定連接類型。 對於範圍以外的日期,瀏覽器直接建立連接。 當您希望在網絡流量大的時候使用代理而在網絡流量不大的時候使用直接連接的情況下,這個函數非常有用。

function FindProxyForURL(url, host)

{

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

return "PROXY proxy:80";

else

return "DIRECT";

}

如果當前系統時間剛好位於參數<day1>和可選參數<day2>指定的日期範圍內,則 weekdayRange( <day1> [, <day2>] [,"GMT"] ) 函數將返回 true。 可選的 GMT 參數指定採用的是格林尼治標準時間,而非當地時間。

http://technet.microsoft.com/zh-cn/library/cc985335.aspx#BKMK_Ex1

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章