Internet Explorer 11’s Many User-Agent Strings
If you found this post, chances are good that you’re searching for IE11’s User-Agent string.
Were you planning to control your website’s behavior based on the browser “sniffed” from the User-Agent (UA) string?
Poorly implemented (non-futureproof) User-Agent sniffing has proven to be the top compatibility problem encountered each time a new version of Internet Explorer ships. As a consequence, the logic around the user-agent string has grown increasingly complicated over the years; the introduction of Compatibility Modes has meant that the browser now has more than one UA string, and legacy extensibility of the string was deprecated after years of abuse.
By way of example, consider...
ASP.NET User-Agent Sniffing
- 2836939 .NET 4 - Win7SP1/Win2K3SP2/Win2K8R2SP1/Win2K8SP2/VistaSP2/WinXPSP3
- 2836940 .NET 3.5 SP1 - Win2K3SP2/Win2K8SP2/VistaSP2/WinXPSP3
- 2836941 .NET 2.0 SP2 - Win2K3SP2/WinXPSP3
- 2836942 .NET 3.5 SP1 - Win7SP1/Win2K8R2SP1
- 2836943 .NET 2.0 SP2 - Win7SP1/Win2K8R2SP1
- 2836945 .NET 2.0 SP2 - Win2K8SP2/VistaSP2
- 2836946 .NET 2.0 SP2 - Win8RTM/WinRTRTM/Win2K12RTM
- 2836947 .NET 3.5 SP1 - Win8RTM/WinRTRTM/Win2K12RTM
Without the hotfix's updated browser definition file, your pages might omit the script blocks from all pages sent to an IE11 client.
See why UA-sniffing is evil?
IE11's Default UA String
By default, Internet Explorer 11 on Windows 8.1 sends the following User-Agent string:
Mozilla/5.0 (Windows NT 6.3; Trident/7.0; rv:11.0) like Gecko
This string is deliberately designed to cause most UA-string sniffing logic to interpret it either Gecko or WebKit. This design choice was a careful one—the IE team tested many UA string variants to find out which would cause the majority of sites to “just work” for IE11 users.
Contrast this string with the old IE10 on Windows 8 UA string:
Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.2; Trident/6.0)
Many websites would scan for the MSIE token and, if present, return non-standard markup which would not render properly in modern versions of IE.
DOM userAgent Property
Internet Explorer 11 continues the IE9 tradition of exposing extensible tokens in the navigator.userAgent property but not sending those tokens in the request header. For instance, by default this property returns the following on IE11/Win8.1:
Mozilla/5.0 (Windows NT 6.3; Trident/7.0; .NET4.0E; .NET4.0C; rv:11.0) like Gecko
If the user chooses to render a site in Compatibility View (click Tools > Compatibility View Settings) then IE will send a User-Agent string that mimics Internet Explorer 7’s UA string:
Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.3; Trident/7.0; .NET4.0E; .NET4.0C)
By default, sites in the Intranet Zone render in Compatibility view, so this is the User-Agent string they’ll see.
Compatibility View List
Internet Explorer 10 introduced the ability for the downloaded Compatibility View List to specify arbitrary UA strings on a per-site basis, to handle cases where a given website only works with a particular UA string.
If you use Fiddler to examine the XML of IE11’s Compatibility View List (e.g. https://iecvlist.microsoft.com/IE11/1375395130872/iecompatviewlist.xml) you will see that it contains a number of UA strings:
…each of which can be sent to a particular domain to help ensure that it renders properly in IE10+:
Obviously, maintaining Compatibility View Lists requires a significant investment on the part of the IE team—resources which could be used to implement more new standards, performance improvements, etc. Please please please: use feature detection rather than User-Agent sniffing.
PS: Also note that in IE11 mode, the navigator.appName property returns Netscape; older versions returned Microsoft Internet Explorer. The new value matches all major browsers including Safari, Chrome, and Firefox.