Auto Proxy Config 自动通过代理服务器访问某些网站:
在C盘根目录下新建文件proxy.pac,用写字板写入如下内容:
function FindProxyForURL(url, host)
{
if (dnsDomainIs(host, ".acs.org"))
return "PROXY 10.1.1.20:8080; DIRECT";
else if (dnsDomainIs(host, ".nature.com"))
return "PROXY 10.1.1.2:80; DIRECT";
else
return "DIRECT";
}
在浏览器中,菜单"工具"-"Internet选项"-"连接"-"局域网设置",不勾"自动检测设置"和"为LAN使用代理服务器。。",勾上"使用自动配置脚本",在地址后面填上file://c:\proxy.pac
proxy.pac称为自动代理配置文件,是用Javascript写的脚本。上面的例子有如下功能:当访问任何网址中含有acs.org的网站时,浏览器将自动通过代理10.1.1.20:8080访问;当访问任何网址中含有nature.com的网站时,浏览器将自动通过代理10.1.1.2:80访问。如果这两个代理链接不上,访问以上两种网站将不通过代理服务器(直接连接),如果是访问其他的网站,直接连接。
关于自动代理配置文件的其他写法,可以参考下面的内容:
Proxy Auto Config檔的語法 II (來自微軟的說明文件)
前陣子整理了一篇PAC語法的文章(這裡)
今天在找另一個課題的解決之道時
無意中看到微軟"Internet Explorer維護"的說明文件也有介紹
功能強大卻又簡單清楚
特別是洋洋灑灑10個範例
相當具有參考價值
JavaScript 或 JScript 自動 Proxy 範例檔
注意事項
- isInNet()、isResolvable() 及 dnsResolve() 函數可查詢 DNS 伺服器。
- 對「物件模型」物件、內容或方法的參照會導致 Proxy 伺服器自動設定檔無法執行。例如,window.open(...)、alert(...) 和 password(...) 的參照會導致 Proxy 自動設定檔無法在 Internet Explorer 上執行。
範例一:近端主機直接連線,其他所有電腦則透過 Proxy 伺服器連線
下列函數會檢查主電腦名稱是否為本端主機,如果是,則會檢查是否為直接連線。如果主機名稱不是本端主機,則連線是透過 Proxy (proxy)。
function FindProxyForURL(url, host) { if (isPlainHostName(host)) return "DIRECT"; else return "PROXY proxy:80"; }
isPlainHostName() 函數會檢查主機名稱中是否有句點。如果有,則傳回 false。否則傳回 true。
範例二:防火牆內的主機直接連線,近端伺服器外的主機透過 Proxy 伺服器連線
下面的函數將檢查主機名稱中是否為「簡單」主機名稱 (即不包含網域名稱),還是非 www 或 home 主機名稱的特定網域 (.company.com) 一部分。
function FindProxyForURL(url, host) { if ((isPlainHostName(host) || dnsDomainIs(host, ".company.com")) && !localHostOrDomainIs(host, "www.company.com") && !localHostOrDoaminIs(host, "home.company.com")) return "DIRECT"; else return "PROXY proxy:80"; }
注意事項
- localHostOrDomainIs() 函數的執行只限於區域網域中的 URL。
- 如果主機名稱中的網域名稱與所給的網域名稱相符,則 dnsDomainIs 函數傳回 True。
範例三:如果主機是可解析的,則為直接連線。否則為透過 Proxy 連線
下面的函數會要求 DNS 伺服器解析所傳遞的主機名稱。如果可以,則建立直接連線。如果不可以,則透過 Proxy 伺服器建立連線。若要使用內部 DNS 伺服器辨識所有的內部主機名稱,可使用本函數。
function FindProxyForURL(url, host) { if (isResolvable(host)) return "DIRECT"; else return "PROXY proxy:80"; }
有關 isResolvable() 函數的注意事項,請參閱本頁開始部分。
範例四:如果主機是在指定的子網路中,則為直接連線。否則為透過 Proxy 連線
下面的函數會將所給的 IP 位址模式和遮罩與主機名稱相比較。若要讓子網路中的某些主機直接連線,而其他主機則透過 Proxy 伺服器連線,可使用本函數。
function FindProxyForURL(url, host) { if (isInNet(host, "999.99.9.9", "255.0.255.0")) return "DIRECT"; else return "PROXY proxy:80"; }
有關 isInNet() 函數的注意事項,請參閱本頁開始部分。
如果主機的 IP 位址與指定的模式相符,函數 isInNet(host, pattern, mask) 傳回 True。遮罩會標示 IP 位址相符的部分 (255=相符,0=略過)。
範例五:根據主機網域決定連線類型
如果主機位於近端,下面的函數將指定建立直接連線。如果主機不位於近端,該函數將依據主機所在的網域,決定使用哪個 Proxy 伺服器。如果主機的網域名稱是選擇 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"; }
如果使用 Shell 表示式模式時,str 與 shexp 相符,則 shExpMatch(str、shexp) 函數會傳回 True。
範例六:根據將使用的通訊協定決定連線類型
下面的函數會擷取所使用的通訊協定,並依據它選擇 Proxy 伺服器。如果無法搭配通訊協定,則直接連線。如果將使用的通訊協定是選擇 Proxy 伺服器的標準之一,可使用本函數。
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 函數從字串中提取指定數目的字元。
範例七:檢查主機名稱是否符合 IP 位址來決定 Proxy 設定
下面的函數將主機名稱轉換為 IP 位址,並將它與指定的字串相比較,以選擇 Proxy 伺服器。
function FindProxyForURL(url, host) { if (dnsResolve(host) == "999.99.99.999") { // = http://secproxy return "PROXY secproxy:8080"; } else { return "PROXY proxy:80"; } }
有關 dnsResolve() 函數的注意事項,請參閱本頁開始部分。
範例八:如果主機的 IP 位址與指定的 IP 位址相符合,則透過 Proxy 連線。否則直接連線
下面的函數是透過指定 IP 位址選擇 Proxy 伺服器的另一種方式。與範例七不同的是,它採用函數呼叫的方式,明確取得數位表示的 IP 位址 (範例七用 dnsResolve() 函數將主機名稱轉化為數字表示的 IP 位址)。
function FindProxyForURL(url, host) { if (myIpAddress() == "999.99.999.99") { return "PROXY proxy:80"; } else { return "DIRECT"; } }
myIpAddress() 函數會傳回正在執行瀏覽器的主機 IP 位址 (以整數加句點的格式)。
範例九:如果主機名稱中有任何句點,則透過 Proxy 連線。否則為直接連線
下面的函數用於查看主機名稱中有多少英文句號。如果主機名稱中有句點,則透過 Proxy 伺服器建立連線。如果主機名稱中沒有句點,則直接建立連線。這是依據主機名稱的型式確定連線類型的另一種方式。
function FindProxyForURL(url, host) { if (dnsDomainLevels(host) > 0) { // if the number of dots in host > 0 return "PROXY proxy:80"; } return "DIRECT"; }
dnsDomainLevels() 函數會傳回一個代表主機名稱句點個數的整數。
範例十:指定每週哪幾天透過 Proxy 伺服器建立連線,其餘直接建立連線
下面的函數透過指定每週有哪些天使用 Proxy 伺服器連線來決定連線類型。不在這些參數之間的那幾天將直接進行連線。若要在網路資料流量過大時使用 Proxy 伺服器,而在網路資料流量減少時進行直接連線,則可使用本函數。
function FindProxyForURL(url, host) { if(weekdayRange("WED", "SAT", "GMT")) return "PROXY proxy:80"; else return "DIRECT"; }
2012年04月02日 13:44 沙发
嗯,谢谢分享,回去一个一个的研究