企业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]-->单击高级和异常区域中键入适当的信息。