企業IT管理員IE11升級指南【15】—— 代理自動配置腳本


企業IT管理員IE11升級指南 系列:

    【1】—— Internet Explorer 11增強保護模式 (EPM) 介紹

    【2】—— Internet Explorer 11 對Adobe Flash的支持

    【3】—— IE11 新的GPO設置

    【4】—— IE企業模式介紹

    【5】—— 不跟蹤(DNT)例外

    【6】—— Internet Explorer 11面向IT專業人員的常見問題

    【7】—— Win7和Win8.1上的IE11功能對比

    【8】—— Win7 IE8和Win7 IE11對比

    【9】—— IE10與IE11的功能對比

    【10】—— 如何阻止IE11的安裝

    【11】—— 通過SCCM 2012和WSUS部署Internet Explorer 11

    【12】—— 兼容視圖列表介紹

    【13】—— 如何把IEMP遷移到GPP

    【14】—— IE11代理服務器配置

    【15】—— 代理自動配置腳本

    【16】—— 使用Compat Inspector快速定位IE兼容性問題

    【17】—— F12 開發者工具

代理自動配置腳本

 

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/

http://technet.microsoft.com/library/Dd361918

http://findproxyforurl.com/

http://support.microsoft.com/kb/271361


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM