HTTP standard (RFC 2616) defines that when a web browser requests something from a website, it should accompany requests with a string, called User-Agent, describing browser components. Each component is expected to have a name, a version and optional comments. The purpose of the user agent string is to allow websites tailor responses for particular browser versions and for statistical analysis of web traffic.
So, most browser publishers came up with user agent strings that identify the browser type, its major components, operating system and user's language.
For example, Mozilla defines this format of their user agent string:
Consequently, FireFox sends this list of components:
Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:220.127.116.11) Gecko/20080404 Firefox/18.104.22.168
, which identifies Mozilla as the product name, lists platform (Windows), operating system name and version (Windows NT 5.1), user language (en-US) and browser components, such as Gecko (the layout engine) and FireFox itself. Opera and other user agents (browsers and robots) define similar identification strings.
Now, let's take a look at the most used web browser, Internet Explorer. This is a typical user agent string used in all versions of Internet Explorer to date:
Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.0; SLCC1; .NET CLR 2.0.50727; .NET CLR 3.0.04506; .NET CLR 1.1.4322; InfoPath.2)
Microsoft clearly trying to follow Mozilla's user agent specification defined on this page, but they identify the application as Mozilla. That's strange - one would expect Microsoft to be proud of their product. The platform is identified as compatible. Is Microsoft is trying to say that Windows (the platform) is compatible with web browsing or that Internet Explorer is compatible with Windows?
This string makes you wonder if the engineers who came up with this string and maintained it over the years ever bothered looking at RFC 2616. How else one would explain that the only properly-formatted text is that they copied from the original Mozilla's string. How hard is it to understand that a product should be separated from a version with a slash? Yet we see MSIE 7.0, not MSIE/7.0, .NET CLR 1.1.4322, not .NET-CLR/1.1.4322 (product tokens cannot have spaces and some other delimiters). How hard is it to understand that multiple components or technologies should be identified on their own and not just be within one comment (parenthesis in user agent strings denote comments).
If Microsoft is concerned about backward compatibility, they should introduce a setting in advanced configuration: a) submit the user agent string from the days we didn't know what we were doing and b) submit the proper user agent string. Here's what I would expect Internet Explorer to submit (adjusted to actual technologies used):
MSIE/7.0 (Windows; en-US; Windows NT 6.0; SLCC1) .NET-CLR/2.0.50727 .NET-CLR/3.0.04506 .NET-CLR/1.1.4322 InfoPath/2
I can only wonder if Microsoft finally will fix their user agent quirk in IE8. Then again, may be their hands are just too full fixing other holes in IE and the existing user agent string will live on as a reminder that Microsoft and public standards and conventions are not very good friends.