Here’s an actual User-Agent header from my logs:
Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.0; Trident/4.0; SLCC1;
.NET CLR 2.0.50727; Tablet PC 2.0; .NET CLR 3.5.21022;
Media Center PC 5.1; Zune 3.0; OfficeLiveConnector.1.2;
.NET CLR 3.5.30729; .NET CLR 3.0.30618)
This is absurd.
And it doesn’t help. My server does not care if you own a Zune or have OfficeLiveConnector 1.2 installed. Most servers don’t. And if they do care, there are better mechanisms for negotiating content.
Starting with the next version of every major browser, the User-Agent should simply read:
browser version
For example:
Internet Explorer 8.0 Firefox 3.2 Chrome 0.4 Safari 4.0 Opera 10.0
And that’s it.
None of this “compatible” nonsense (all lies anyway), no more details about the rendering engine. Don’t even include a hint about the platform (Windows, OSX, Linux, etc). If the browser supports multiple operating systems, then it should support them all equally well enough that the server doesn’t need to know.
If necessary, the browser should instead use Accept headers to send stronger signals about what type of content it desires.
Stop the User-Agent madness now. Think of the bytes.

November 9th, 2008 at 5:31 am
I doubt we can make this change to the User-Agent given the implications for backwards compatibility. On the other hand nothing stops various browsers from using a new header.
November 9th, 2008 at 10:22 am
You can try changing the user agent in your browser to blank or Firefox 3.0 and see what happens. Sadly, I’ve had to go in the other direction, changing Camino’s user agent to lie and say it’s Firefox :(
November 9th, 2008 at 11:11 am
@Amit – that’s exactly my point. We’re asking the servers to parse the User-Agent string anyway, and since the client are trying to second-guess the servers’ behaviors, we’re in this downward spiral.
The best way to break that cycle is to have all the browser vendors simply agree to stop. The servers will still serve up content differently to different browsers, but matching on a simple (browser, version) tuple is no worse than the nonsense of today.
November 9th, 2008 at 11:23 am
In theory, I agree to your point. But there are a ton web sites out there even now that expect only certain browsers. There is no need to “punish” those web sites even though most of us don’t browse those sites often.
As you point out, since there are better techniques than to rely on User-Agent, why not just ignore that header. It’s just an extra line in the request!
November 9th, 2008 at 8:12 pm
Leaving the OS in the header can be beneficial – not from a rendering point-of-view, but can help improve the user experience. E.g., pidgin.im shows the download button for your OS on the homepage (other OS downloads are still accessible, but the version for your current OS is given feature placement).
November 9th, 2008 at 8:27 pm
Indeed the problem is largely backwards compatibility. Unless you know of a way to coordinate the web updating all it’s code… your going to break compatibility with many sites.
Not to mention some things are useful, such as OS as other people have mentions. Platform is also useful, especially on Mac OS X or Linux where you may have different architectures.
Just because it doesn’t impact you, doesn’t mean the web doesn’t need the info.
That said, some companies have taken it to far (I’m looking at you: various toolbars who append themselves to the useragent).
November 12th, 2008 at 3:48 pm
Hi DeWitt,
I’m trying to study user agents and came across your blog. I agree with you that it doesn’t make sense to have all this masking going on. It’d be better if they just have a browser type and version number. It’ll make the world a better place =).
I’m working on identifying mobile devices from the user agent strings and was wondering if you’d have any advice on how to approach this. I mainly look for keywords such as Blackberry | Nokia | IEMobile | etc. I also came across Zune as another keyword (which is how I came here) and was wondering if it’s safe to assume a user agent with Zune in its string is using a mobile device.
You don’t have to answer, but thought I ask anyways. Thanks!
November 12th, 2008 at 8:40 pm
Siu Cheung:
Interesting question about the Zune. My sense is that no, we can’t make too many assumptions about the platform based exclusively on the the User-Agent headers. In this particular case, I believe the “Zune 3.0″ string simply means that the owner has installed the Zune software, which for reasons unclear to me, take the liberty of modifying IE’s user agent.
That said, I suspect that all of the major mobile browsers do have their own signatures, and the best way to discover them would be set up a web server and borrow some mobile devices and see what they send in practice.
Good luck!
November 14th, 2008 at 3:31 am
About only sending a browser name and version number, I have a N800 Internet Tablet that runs MicroB 1.0.4.
Now this browser uses the same rendering engine as Firefox 3.0. However, if it would only identify itself as “MicroB 1.0.4″, I would guess most websites would present me with a “compatibility” version of their site that would display on any browser. Like the “Basic HTML” version of GMail.
What would be your solution to “exotic”, little-known browsers that do have powerful rendering engines?