Internet Explorer在HTTP调用与navigator.userAgent中,User-Agent标头不同

时间:2014-07-28 16:01:00

标签: javascript angularjs internet-explorer http-headers user-agent

我需要获取用于通过AngularJS发送HTTP请求的User-Agent标头。当我使用Internet Explorer时,在Fiddler中我看到在请求中发送的User-Agent等于:

Mozilla/5.0 (Windows NT 6.1; WOW64; Trident/7.0; rv:11.0) like Gecko

但是,当我使用navigator.userAgent获取用户代理时,它会返回:

Mozilla/5.0 (Windows NT 6.1; WOW64; Trident/7.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0; .NET4.0C; .NET4.0E; rv:11.0) like Gecko

我在HTML <meta http-equiv="X-UA-Compatible" content="IE=edge" />中添加了<head>标记,希望能够解决问题,但事实并非如此。我还尝试启用和禁用Intranet(在本例中为localhost)站点的兼容性视图。

背景:用户代理通过查询字符串(以及查询字符串中的身份验证令牌)传递给Windows Click-once应用程序。 Windows应用程序需要使用与AngularJS应用程序相同的身份验证令牌和用户代理,否则如果用户代理不同,HTTP API调用将导致401。 Windows应用程序不应要求用户登录,并且应使用与浏览器用户相同的身份验证上下文。

如何获取我在Fiddler中观察到的实际用户代理?

1 个答案:

答案 0 :(得分:3)

据我所知,在HTTP请求中发送的版本和通过navigator.userAgent获得的版本之间的Internet Explorer版本9及更高版本中的用户代理字符串几乎会因为所谓的功能令牌而有所不同在字符串中(只有偶然的新安装,他们可能会在短时间内相同)。这里解释了背景:http://msdn.microsoft.com/en-us/library/ms537503%28v=vs.85%29.aspx

来自msdn-document:

  

早期版本的Internet Explorer包含使用Pre-Platform定义的功能令牌   在HTTP协商过程中,Post-Platform键是用户代理字符串的一部分。随着时间的推移,   这导致过长的用户代理字符串,这反过来又为某些Web服务器带来了问题。   当用户代理字符串超过256个字符时,通常会出现问题。互联网   Explorer 9,用户代理字符串在HTTP协商期间不再包含功能令牌。特征   标记包含在导航器对象的userAgent属性返回的值中。   应相应地修改依赖于早期行为的应用程序。

使用<meta http-equiv="X-UA-Compatible" content="IE=EmulateIE8" />元标记设置兼容性视图模式也不会影响用户代理问题(我在MSIE 10和MSIE 11中测试它)。

我能想象的唯一的部分解决方案(这将是不可靠的)将从通过java脚本获得的字符串中剥离已知的要素属性,然后尝试比较字符串。

不幸的是,我怀疑你应该尝试为你的问题找到一个不涉及用户代理字符串比较的其他解决方案。