企業IT管理員IE11升級指南 系列:
【1】—— Internet Explorer 11增強保護模式 (EPM) 介紹
【2】—— Internet Explorer 11 對Adobe Flash的支持
【6】—— Internet Explorer 11面向IT專業人員的常見問題
【11】—— 通過SCCM 2012和WSUS部署Internet Explorer 11
【16】—— 使用Compat Inspector快速定位IE兼容性問題
代理自動配置腳本
Contents
簡介... 2
設計技巧... 2
處理大小寫... 2
有效利用縮進... 3
處理localhost和回送地址... 3
通過PAC屏蔽網站... 3
合理使用變量... 3
慎用isInNet, isResolveable, dnsResolve方法... 4
IE PAC結果緩存... 4
使用Substrings. 4
區分Text和Numeric. 5
負載均衡proxy. 5
調試... 6
本地PAC測試... 6
通過alert()調試... 6
將PAC方法至於HTML頁面中調試... 7
PAC文件下載... 7
參考... 7
簡介
代理自動配置(Proxy auto-config,簡稱PAC) 是一種網頁瀏覽器技術,用於定義瀏覽器該如何自動選擇適當的代理服務器來訪問一個網址。
一個PAC文件包含一個JavaScript形 式的函數“FindProxyForURL(url, host)”。這個函數返回一個包含一個或多個訪問規則的字符串。用戶代理根據這些規則適用一個特定的代理其或者直接訪問。 當一個代理服務器無法響應的時候,多個訪問規則提供了其他的后備訪問方法。 瀏覽器在訪問其他頁面以前,首先訪問這個PAC文件。PAC文件中的URL可能是手工配置的,也可能是是通過網頁的網絡代理自發現協議(Web Proxy Autodiscovery Protocol)自動配置的。
要使用PAC,我們應當在一個網頁服務器上發布一個PAC文件,並且通過在瀏覽器的代理鏈接設置頁面輸入這個PAC文件的URL或者通過使用WPAD協議告知用戶代理去使用這個文件。
一個PAC文件是一個至少定義了一個JavaScript函數的文本文件。這個函數FindProxyForURL(url, host)有2個參數:url是一個對象的URL,host是一個由這個URL所衍生的主機名。按照慣例,這個文件名字一般是proxy.pac. WPAD標准使用wpad.dat.
雖然大多數客戶端無論從HTTP請求返回的MIME類型是什么都能正確處理,但為了完整性和最佳的兼容性,我們應該設置網頁服務器將這個文件的MIME類型聲明為 application/x-ns-proxy-autoconfig 或者 application/x-javascript-config .
沒有什么理由偏愛一種MIME類型多一些,如果有的話,假設 application/x-ns-proxy-autoconfig 相對 application/x-javascript-config 被更多的客戶端所支持是可以理解的。因為它被定義在最初的Netscape規范里面,后者是最近才開始被使用。
一個非常簡單的PAC文件內容
function FindProxyForURL(url, host) { return "PROXY proxy.example.com:8080; DIRECT"; }
設計技巧
處理大小寫
有些瀏覽器對大小寫敏感,例如www.microsoft.com與WWW.MICROSOFT.COM被認為是不同的主機。如果想忽略大小寫,通常情況下可以將參數轉換為小寫之后進行使用。
var lhost = host.toLowerCase();
host = lhost;
有效利用縮進
有效利用縮進可以提高pac文件的閱讀性和可維護性,對於縮進一條簡單的規則是花括號之后縮進一個制表符,匹配的花括號之間對齊。
處理localhost和回送地址
localhost和回送地址(127.0.0.1)應該直接跳過代理,可以參考以下邏輯。
if ((host == "localhost") || (shExpMatch(host, "localhost.*")) || (host == "127.0.0.1")) { return "DIRECT"; }
通過PAC屏蔽網站
通過PAC文件可以很容易的屏蔽網站,做法是直接返回一個回送地址使得請求無法送出,這樣還可以節省客戶端到代理之間的帶寬。唯一需要注意的一點是不要將請求發送給本地正在監聽的端口。
if (dnsDomainIs(host, ".badspyware.com") || dnsDomainIs(host, ".worsespyware2.com")) { return "PROXY 127.0.0.1:48890"; }
合理使用變量
在PAC文件中合理定義變量可以優化執行效率,增加代碼可讀性。例如通過以下方式定義變量myip來緩存本地ip地址,這樣就避免每次都調用相同方法來查詢本地ip。
myip = myIpAddress();
另外一種常見的用法是將准備返回的proxy定義變量,然后隨着程序邏輯對其進行更改。
function FindProxyForURL(url, host) { // Set the default proxy variable that users get if they don’t match // any more specific rule. proxy = "PROXY coreproxy.company.com:8000"; // Los Angeles WAN subnets go to LA proxy if (isInNet(myIpAddress(), "10.100.0.0", "255.252.0.0")) { proxy = "PROXY la-proxy.company.com:8000"; } // New York WAN subnets go to New York proxy if (isInNet(myIpAddress(), "10.200.0.0", "255.252.0.0")) { proxy = "PROXY ny-proxy.company.com:8000"; }
一般采用以上方式處理proxy時,邏輯上會先處理最通用的情況然后再處理特殊的情況,最終返回proxy的當前值給瀏覽器。
return proxy;
慎用isInNet, isResolveable, dnsResolve方法
很多PAC開發人員經常使用isInNet(host,”a.b.c.d”)是否位於某ip段中,但是該方法的調用會使瀏覽器為每個主機名發送dns反向查詢請求。如果一個網絡中有很多客戶端都在發送類似請求,將大大增加dns服務器的負載。
IE PAC結果緩存
IE的PAC處理存在一個與其他瀏覽器較大的不同之處,在於IE瀏覽器會將PAC的處理結果緩存,即可以認為是對於每個host,PAC文件只執行一次,直到下次重啟IE才會重新執行。這樣就會導致一些PAC邏輯看起來不能正常工作,例如需要通過url中的非host信息來返回不同的代理。
IE PAC結果緩存可以通過以下注冊表禁用
HKEY_CURRENT_USER\Software\Policies\Microsoft\Windows\CurrentVersion\Internet Settings
Value: EnableAutoproxyResultCache
Type: REG_DWORD
Data value: 0 = disable caching; 1 (or key not present) = enable automatic proxy caching (this is the default behavior)
使用Substrings
如正常的JavaScript方法一樣,可以通過使用Substring來判斷url或host中部分字符串是否滿足特定條件,從而處理不同邏輯,一種比較常見的用法是判斷url使用的是那種協議,然后返回不同的代理。
if (url.substring(0,4) == "http") { return "PROXY http-proxy.company.com:8000"; } //matches HTTP and HTTPS URLs if (url.substring(0,3) == "ftp") { return "PROXY ftp-proxy.company.com:8000"; } //matches FTP:// links if (url.substring(0,3) == "mms") { return "PROXY http-proxy.company.com:8000"; } //matches MMS links
區分Text和Numeric
注意字符串類型和數字類型的區別,例如“92”是字符串,如果需要使其變為數字類型,需要調用parseInt方法。
numvariable = parseInt(textvar);
負載均衡proxy
很多機構內部有多個代理服務器,但並沒有通過負載均衡器來對代理服務器進行負載管理。通過PAC文件可以通客戶端邏輯進行簡單的負載均衡。
// Find the 4th octet var myip=myIpAddress() var ipbits=myip.split(".") var myseg=parseInt(ipbits[3]) // Check to see if the 4th octect is even or odd if (myseg==Math.floor(myseg/2)*2) { // Even proxy = "PROXY p1.company.com:8080; PROXY p2.company.com:8080"; } else { // Odd proxy = "PROXY p2.company.com:8080; PROXY p1.company.com:8080"; }
調試
PAC文件的編寫難免需要進行測試和調試,例如你在編寫過程中出現了JavaScript語法錯誤,或者有些方法返回了意想不到的結果。很多瀏覽器並沒有提供對於PAC腳本調試的支持,對於PAC文件調試也需要一些技巧。
本地PAC測試
有些情況下PAC文件看上去完全沒有起作用,我們可以通過將PAC文件下載到本地,並通過本地文件的方式來訪問該PAC文件進行測試。
注意在IE11中默認禁用了本地PAC文件,進行本地PAC文件測試需要更改以下注冊表項,
Key: HKLM\SOFTWARE\Policies\Microsoft\Windows\CurrentVersion\Internet Settings\
Value: EnableLegacyAutoProxyFeatures
Type: REG_DWORD
Data: 1
通過alert()調試
通過添加alert()方法可以有效的幫助調試,例如myIpAddress()取得了一個錯誤的地址,通過alert方法可以很容易的發現類似問題。
if ((host =="proxyinfo.company.com")) {
alert("Local IP address is: " + myIpAddress());
}
alert也可以幫助定位腳本語法錯誤,例如在不同的邏輯路徑上進行alert,正確情況下會彈四個對話框,但最終僅僅彈出三個,那么我們可以判斷在第三個於第四個alert之間可能存在語法錯誤。
將PAC方法至於HTML頁面中調試
將PAC文件的function FindProxyForURL(url, host)方法置於html頁面中然后通過瀏覽器打開,可以很容易的發現腳本中的語法錯誤。
<html> <head> <script language="JavaScript"> Insert your ENTIRE PAC file here </script> </head> <body> test </body> </html>
PAC文件下載
由於PAC文件通常被放在一個Web服務器上,一個常見的問題就是下載問題,判斷是否存在PAC文件下載問題,可以通過瀏覽器直接輸入PAC地址嘗試下載來查看是否能夠下載成功。
參考
http://en.wikipedia.org/wiki/Proxy_auto-config
http://www.proxypacfiles.com/proxypac/