转载 http://www.cnblogs.com/maoniu602/p/3799958.htmljavascript
你是否遇到过当使用一个涉及到Cookie操做的网站或者管理系统时,IE 六、七、八、9下都跑的好好的,惟独到了IE十、11这些高版本浏览器就不行了?好吧,这个问题码农连续2天内遇到了2次。那么,咱们就来看看,这个问题的来龙去脉。html
先说下这2次的使用场景,一次是在某页面中,先存Cookie,而后再入库记录相关数据,可是发布到生产环境后,入库操做没有发生;后来经过打印日志发现问题卡在这里:java
if (Request.Browser.Cookies)
也就是说,在客户端是IE10的环境下,这里返回False!纳尼,IE10默认配置下不支持Cookie?微软你玩个人吧。正则表达式
第二次是某地市的升级测试,在IE10的环境下,自服务网站登陆失败;这个问题很奇怪,由于以前已经升级过多个地市了,IE10使用都正常。这极大的引发了码农的兴趣,由此引出了此文。浏览器
描述完场景,咱们就来分析分析。虽然直觉告诉码农,多是Cookie的读取或写入有问题,但毕竟直觉这玩意儿不靠谱,咱仍是得用事实和证听说话。国际惯例,先抓个HTTP包瞧瞧:服务器
上图是IE10下登陆失败时,服务端返回的HTTP响应头;下图是其它浏览器正常登陆时,服务端返回的HTTP响应头,注意红色框框标注部分;cookie
致使问题的直接缘由,很清晰了吧:服务器响应请求时,没有回发 Set-Cookie 头,没有这个头,客户端浏览器就没法写入Cookie。因此基于Form认证(在Cookie中会存入加密票据)的自服务网站,会没法登陆。app
这时,你可能会以为奇怪了,为啥只有IE十、IE11 会这样,其它IE浏览器跑的妥妥的呢?嗯,为了知足你的好奇心,咱们继续分析。dom
若是你的机器上装了.NET的FrameWork,打开这个目录 C:\Windows\Microsoft.NET\Framework\v4.0.30319\Config\Browsers。科普下,文件夹里面的.browser文件是全局访问的,用于标识发出请求的浏览器,并标识这些浏览器具有的功能。若是要作定制修改(好比针对特定移动设备),只需把相应的.browser文件复制到应用程序的\App_Browsers文件夹中修改便可。先用记事本打开 ie.browser 这个文件,ecmascript
注意图中标注为红色部分的正则表达式;而后再来看看,微软公布的IE10的User-Agent : Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.1; Trident/6.0),MSIE版本号由之前的1位数字(5-9)变成了如今的2位数字(10),很明显,没法匹配上面的正则了吧。因此,因为没法正确识别IE10的User-Agent,因此ASP.NET把它看作是未知的浏览器,认为它不支持Cookie,由此而产生了一系列与Cookie相关的问题。
问题的根本总算是知道了,那么该如何解决呢?
其实这个问题已经通过微软官方确认,是IE10的Bug,其实也能够认为是ASP.NET 2.0、3.五、4.0的Bug,因这些版本都没法识别 IE10的User-Agent。微软专门发布了HOTFIX来修复这个问题:
码农单位的不少Windows服务器都会自动更新安装补丁,因此场景2中说的其它地市使用正常,实际上是由于这些服务器已经打上了补丁,一些新上架、重装系统的服务器或自动更新没有设置的服务器就极可能会出现这类问题。。。
若是对服务器没有操做权限或者不想打补丁这么麻烦,好比码农我,也能够在网站的根目录,新增一个浏览器定义文件,步骤以下:
一、添加一个"App_Browsers"文件夹 ;
二、添加一个"*.browser"后缀的文件,如 IE10.browser;
三、在文件中添加以下内容(下面的配置表示,对全部的设备和浏览器,都支持Cookies):
<browsers> <browser refID="Default"> <capabilities><!-- To avoid wrong detections of e.g. IE10 --> <capability name="cookies" value="true" /> <capability name="ecmascriptversion" value="3.0" /> </capabilities> </browser> </browsers>
这是针对某个站点的配置,若是既不想打补丁又想对服务器上的全部站点作全局配置,要如何处理呢?很容易,其实上面已经明示,问题是出在ie.browser 这个文件的配置上,因此咱们只需在原来的基础上,加上这一串 "\d{2,}$",使ASP.NET 能识别IE10的User-Agent就能够了。修改后的配置以下:
<capability name="majorversion" match="^[6-9]|\d{2,}$" />
修改完后,再到命令行下将修改后的 .browser 文件编译成程序集并安装到GAC中,若是是Windows Server 200八、Win7,要以管理员身份运行命令行:C:\Windows\Microsoft.NET\Framework\v4.0.30319\aspnet_regbrowsers.exe -i
若是是IE11,因为其User-Agent "Mozilla/5.0 (Windows NT 6.3; Trident/7.0; rv:11.0) like Gecko" 变化更大,因此需把下面这串加入来作匹配:
<!-- Mozilla/5.0 (Windows NT 6.3; Trident/7.0; rv:11.0) like Gecko --> <browser id="IE11Preview" parentID="Mozilla"> <identification> <userAgent match="Trident/(?'layoutVersion'\d+).*rv:(?'revision'(?'major'\d+)(\.(?'minor'\d+)?))" /> <userAgent nonMatch="MSIE" /> </identification> <capabilities> <capability name="browser" value="IE" /> <capability name="layoutEngine" value="Trident" /> <capability name="layoutEngineVersion" value="${layoutVersion}" /> <capability name="isColor" value="true" /> <capability name="screenBitDepth" value="8" /> <capability name="ecmascriptversion" value="3.0" /> <capability name="jscriptversion" value="6.0" /> <capability name="javascript" value="true" /> <capability name="javascriptversion" value="1.5" /> <capability name="w3cdomversion" value="1.0" /> <capability name="ExchangeOmaSupported" value="true" /> <capability name="activexcontrols" value="true" /> <capability name="backgroundsounds" value="true" /> <capability name="cookies" value="true" /> <capability name="frames" value="true" /> <capability name="javaapplets" value="true" /> <capability name="supportsCallback" value="true" /> <capability name="supportsFileUpload" value="true" /> <capability name="supportsMultilineTextBoxDisplay" value="true" /> <capability name="supportsMaintainScrollPositionOnPostback" value="true" /> <capability name="supportsVCard" value="true" /> <capability name="supportsXmlHttp" value="true" /> <capability name="tables" value="true" /> <capability name="supportsAccessKeyAttribute" value="true" /> <capability name="tagwriter" value="System.Web.UI.HtmlTextWriter" /> <capability name="vbscript" value="true" /> <capability name="revmajor" value="${major}" /> <capability name="revminor" value="${minor}" /> </capabilities> </browser>
三板斧搞定!
幸福来的就是这么忽然~~~