企業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兼容性問題
IE11代理服務器配置
自動檢測配置
WPAD代表Web Proxy Auto-Discovery Protocol,是客戶端通過DHCP或DNS協議探測代理服務器配置腳本url的一種方式。當IE定位腳本並將腳本下載到本地之后,就可以通過該腳本 來為不同的url選擇相應的代理服務器。目前主流瀏覽器一般都支持WPAD。本文主要介紹IE中WPAD相應的工作原理以及常見WPAD相關的問題的解決 方案。
工作流程
當IE Internet Options連接中配置為自動發現設置時,IE會根據以下方式來探測WPAD.dat文件
- DHCP(252 option)
- DNS A record query
- NetBios
如果DHCP配置了WPAD的地址,IE則使用該地址發送http get請求得到相應的WPAD.dat文件。即使該地址請求失敗,IE也不會繼續使用DNS探測的結果。
如果DHCP服務器沒有提供WPAD信息,DNS探測結果就會被采用。例如用戶的計算機名為pc.department.branch.example.com,IE會按照如下url順序來請求WPAD.dat文件。
- http://WPAD.department.branch.example.com/WPAD.dat
- http://WPAD.branch.example.com/WPAD.dat
- http://WPAD.example.com/WPAD.dat
- http://WPAD.com/WPAD.dat
如果DNS探測仍然失敗,IE則通過Netbios來請求WPAD。
當Netbios請求仍然失敗的話,IE則會嘗試直接發送網絡請求。
DHCP WPAD探測邏輯
IE通過調用DhcpRequestParams方法來得到DHCP 252 option。根據MSDN對該方法的描述,該返回結果會在本地緩存起來。
DHCP clients store data obtained from a DHCP server in their local cache. If the DHCP client cache contains all data requested in the RecdParams array of a DhcpRequestParams function call, the client returns data from its cache. If requested data is not available in the client cache, the client processes the DhcpRequestParams function call by submitting a DHCP-INFORM message to the DHCP server。
因此DHCP-INFORM消息只在第一次或者cache被清空的時候被發送。以下是一個DHCP-INFORM消息的示例。
55 10.0.0.101 255.255.255.255 DHCP DHCP:Request, MsgType = INFORM, TransactionID = 0x33276787 56 10.0.0.1 10.0.0.101 DHCP DHCP:Reply, MsgType = ACK, TransactionID = 0x33276787 Frame: Number = 56, Captured Frame Length = 371, MediaType = ETHERNET …… - Dhcp: Reply, MsgType = ACK, TransactionID = 0x33276787 OpCode: Reply, 2(0x02) Hardwaretype: Ethernet HardwareAddressLength: 6 (0x6) …… + MessageType: ACK - Type 53 + ServerIdentifier: 10.0.0.1 - Type 54 + SubnetMask: 255.255.0.0 - Type 1 + DHCPEOptionsVendorSpecificInformation: + DomainName: ctest.local - Type 15 + DomainNameServer: 10.0.0.1 - Type 6 + WPAD: http://consto.ctest.local/WPAD.dat - Type 252 + End:
另外有兩點值得注意:
- IE只支持IPv4 DHCP的探測,不支持IPv6 DHCP探測
- IE會嘗試通過所有的網絡卡來探測DHCP設置。
當IE得到WPAD.dat文件的地址,IE發送http get請求得到WPAD.dat文件,這與通過IE地址欄寫入url發送請求一樣。一旦WPAD.dat文件返回成功,IE會將該WPAD.dat的地址 存進注冊表HKCU\Software\Microsoft\Windows\CurrentVersion\Internet Settings\Connections\DefaultConnectionSettings中。另外將WPAD.dat文件寫進IE緩存目錄 Temporary Internet Files。當IE再次發送其他網頁請求的時候,IE會從注冊表中讀取WPAD.dat的地址,之后發現緩存中可以找到該地址對應的文件緩存,之后使用該 文件來確定相應的代理服務器。
常見問題
在使用IE過程中有以下兩種問題比較常見,
1. DHCP服務器上更新了252 option的WPAD.dat地址,但是IE並沒有按照新地址的WPAD.dat文件來使用代理服務器。 這種情況多數是由於IE緩存了WPAD.dat的地址在注冊表HKCU\Software\Microsoft\Windows \CurrentVersion\Internet Settings\Connections\DefaultConnectionSettings。
2. WPAD.dat文件內容被更新,但是IE並沒有按照的新WPAD.dat文件來使用代理服務器。 這種情況多數是由於IE緩存了WPAD.dat文件,沒有去請求新的WPAD.dat的內容。
對於第一個問題,我們可以執行如下步驟來清空不同級別的緩存,
清空DHCP緩存
ipconfig /release
ipconfig /renew
清空DNS緩存
ipconfig /flushDNS
清空注冊表WPAD.dat地址緩存
HKCU\Software\Microsoft\Windows\CurrentVersion\Internet Settings\Connections\DefaultConnectionSettings HKCU\Software\Microsoft\Windows\CurrentVersion\Internet Settings\Connections\SavedLegacySettings
清空IE緩存
RunDll32.exe InetCpl.cpl,ClearMyTracksByProcess 8
對於第二個問題,可以從客戶端和服務器兩個方面去解決,
- 在客戶端清空IE緩存。
- 在服務器端為WPAD.dat文件添加cache-control: no-cache http header,這樣WPAD.dat文件將不會被IE緩存。即使服務器WPAD.dat內容被頻繁更新客戶端也會及時得到。不過這樣會對性能有一定的影 響,畢竟要多發送請求來得到WPAD.dat文件。
調試方法
如果上述解決方案對你遇到的問題不起作用,也可以嘗試通過以下方式來查找問題發生的原因,對於這類問題一般的調試方法是通過Process Monitor + Networ Monitor, 通過process monitor來追蹤注冊表訪問情況和本地緩存中wpad文件的訪問情況,通過network monitor來抓包查看是否發送了wpad相關請求。
Process Monitor
Network Monitor
自動配置腳本
代理自動配置(Proxy auto-config,簡稱PAC) 是一種網頁瀏覽器技術,用於定義瀏覽器該如何自動選擇適當的代理服務器來訪問一個網址。
一個PAC文件包含一個JavaScript形 式的函數“FindProxyForURL(url, host)”。這個函數返回一個包含一個或多個訪問規則的字符串。用戶代理根據這些規則適用一個特定的代理其或者直接訪問。 當一個代理服務器無法響應的時候,多個訪問規則提供了其他的后備訪問方法。 瀏覽器在訪問其他頁面以前,首先訪問這個PAC文件。
要使用PAC,我們應當在一個網頁服務器上發布一個PAC文件,並且通過在瀏覽器的代理鏈接設置頁面輸入這個PAC文件的URL。
一個PAC文件是一個至少定義了一個JavaScript函數的文本文件。這個函數FindProxyForURL(url, host)有2個參數:url是一個對象的URL,host是一個由這個URL所衍生的主機名。按照慣例,這個文件名字一般是proxy.pac.
雖然大多數客戶端無論從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";
}
調試方法
本地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地址嘗試下載來查看是否能夠下載成功。
手動配置
手動配置代理是一種常見的代理配置方法,通過在Internet Options – Connections – LAN Settings中指定特定代理地址來實現。
手動配置也經常被用來定位自動配置中代理的問題,例如懷疑自動配置中某代理存在連接問題,可以通過手動直接指定來確定是否可以成功連接。
注意:使用手動配置時要禁用自動配置和配置腳本,否則自動配置會覆蓋手動配置。
常見問題
手動配置中一個常見問題,當連接到本地網絡上使用的 Internet 協議 (IP) 地址或完全限定域名 (FQDN) 的 Web 服務器時,Microsoft Internet Explorer 或 Windows Internet Explorer 連接通過指定的代理服務器即使在開啟了Bypass proxy server for local addresses選項。
但是,如果您連接到 Web 服務器的主機名 (例如,http://webserver) 使用的 IP 地址 (例如,http://10.0.0.1) 或 FQDN (例如,http://webserver。domainname.com)、 跳過代理服務器和 Internet Explorer 直接連接到服務器。
該問題原因在於Bypass proxy server for local addresses僅對host name進行檢查,若要跳過某一范圍內的 IP 地址或特定域的名稱,指定代理服務器例外列表中的地址:
<!--[if !supportLists]-->· <!--[endif]-->在 Internet Explorer 中,在工具菜單上,單擊Internet 選項。
<!--[if !supportLists]-->· <!--[endif]-->在連接選項卡上,單擊局域網設置。
<!--[if !supportLists]-->· <!--[endif]-->單擊高級和異常區域中鍵入適當的信息。