Увидел ссылку на этот текст тут в новых. Очень понравился, жаль, что ссылка не вышла на главную. Поэтому решил сделать вольный перевод, постаравшись сохранить стиль повествования.

В Начале был NCSA Mosaic, и назвал он себя
NCSA_Mosaic/2.0 (Windows 3.1), и показал он пользователем картинки в тексте, и было много радости.

И вот, пришёл новый браузер, «Mozilla», сокращение от «Mosaic Killer» — но не обрадовались бы такому в Mosaic, посему пришлось переименоваться в Netscape, а представляться как
Mozilla/1.0 (Win3.1), и было ещё больше счастья и радости: поддерживал нетскейп фреймы, и понравились фреймы народу. Но мозайк не поддерживал фреймы — и стали определять юзер-агент, и Мозилле вебмастера слали фреймы, а остальным — не фреймы.
И сказали Нетскейп: «давайте постебёмся над Майкрософт и обзовём винду плохоотдебаженными драйверами устройств», и Майкрософт обиделись. И сделали они свой браузер, назвав его Интернет Эксплорером, убийцей нетскейпа. И поддерживал ИЕ фреймы, но не был мозиллой, и не получал фреймы. Нетерпелив был майкрософт, не хотел ждать милости вебмастеров, и декларировали они ИЕ как «Мозилла-совместимый», и стал он притворятся нетскейпом, и представился как
Mozilla/1.22 (compatible; MSIE 2.0; Windows 95), и получил он фреймы, и праздник был в майрософте, но вебмастера задумались.


И продавала M$ IE вместе с Окнами, и сделали они его лучше нетшкафа, и первая браузерная война загремела на земле. И проиграл Нетскейп, и много радости было у майкрософт. Но возродился нетскейп Мозиллой, и сотворила Мозилла Gecko, и назвалась
Mozilla/5.0 (Windows; U; Windows NT 5.0; en-US; rv:1.1) Gecko/20020826. Геко был движком, и был хорош. И стала Мозилла Огнелисом, и назвалась
Mozilla/5.0 (Windows; U; Windows NT 5.1; sv-SE; rv:1.7.5) Gecko/20041108 Firefox/1.0, и был Огнелис ещё лучше. И стал Геко плодится, и многие браузеры позаимствовали его код, и назвали себя один —
Mozilla/5.0 (Macintosh; U; PPC Mac OS X Mach-O; en-US; rv:1.7.2) Gecko/20040825 Camino/0.8.1, второй —
Mozilla/5.0 (Windows; U; Windows NT 5.1; de; rv:1.8.1.8) Gecko/20071008 SeaMonkey/1.0: каждый притворялся Мозиллой, и каждый работал на Геко.

И Геко был хорош, чего не сказать об IE, и снова началась дискриминация: Геко давали хороший код, а остальным нет. И горевали сторонники Линукса, ведь создали они Konqueror, и был он движим KHTML, который мнили они не хуже Геко, но то был не Геко, и не получал он хороших страниц. Так Конкерор стал притворятся Геко, и получил хорошие страницы, назвавшись
Mozilla/5.0 (compatible; Konqueror/3.2; FreeBSD) (KHTML, like Gecko), и стало ещё больше путаницы.

Потом пришла Опера, и сказала: «пусть сами пользователи определят судьбу юзер-агента своего», и сделаи менюшечку, и притворялась опера то
Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; en) Opera 9.51, то
Mozilla/5.0 (Windows NT 6.0; U; en; rv:1.8.1) Gecko/20061208 Firefox/2.0.0 Opera 9.51, то
Opera/9.51 (Windows NT 5.1; U; en).

И создали Apple Сафари, и использовали KHTML, но улучшили его, и ответвили в свой проект WebKit, но страницы хотели оптимизированные под KHTML, и назвались потому
Mozilla/5.0 (Macintosh; U; PPC Mac OS X; de-de) AppleWebKit/85.7 (KHTML, like Gecko) Safari/85.5, и стало только хуже.
И испугались Майкрософт лисьей силы, и вернулся ИЕ, и назвался
Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.0), и показывал правильно, но только по просьбе вебмастера.

И вот Гугл создали Chrome, и использовало их детище ВебКит, и хотели они страниц для Сафари, и притворились Сафарей. И вот Chrome использовал WebKit, притворяясь Safari, а WebKit притворялся KHTML, KHTML притворялся Gecko, и все вместе притворялись Mozilla, и вот и назвался Хромой
Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US) AppleWebKit/525.13 (KHTML, like Gecko) Chrome/0.2.149.27 Safari/525.13, и окончательно засрался юзер-агент, став практически бесполезным, и все притворяются всеми, и путаница процветает.
комментарии (72)
Получается, что только «референсные» взяли.
2) , здесь говориться по поводу полноценных браузеров. (это о Lynx).
3) iCab и кучу других браузеров, которыми пользуются 0,0… % пользователей обычно основаны либо на Геко либо на KHTML
А iCab лишь недавно перешел на WebKit
плюс!
Как учение какой-то секты.
А тут прекрасно виден весь юмор сложившейся ситуации.
Читать бы стал.
Интересна сама тема.
Академический язык Википедии не критичен, меня вполне удоволетворил бы и обычный литературный.
Что не минусуете — это хорошо, хотя и не особо важно.
Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.0; SLCC1; .NET CLR 2.0.50727; Media Center PC 5.0; .NET CLR 3.0.04506)
Спасибо. Стало понятней.
Про опиру стоит упомянуть, что та с пятой версии (или даже раньше?) прикидывалась IE, копируя и то, что ie прикидывался mozilla…
Кстати говоря, Opera/9.51 (Windows NT 5.1; U; en) — самый вменяемый UA. Вменяемее только NCSA_Mosaic/2.0 (Windows 3.1)
Лучше б сосредоточились на соответствии стандартам w3c, думаю всем станет легче, если не придется проводить часы над кросс-браузерной оптимизацией. Конечно в большей степени это относится только к одному браузеру, но да ладно, стараться должны все.
Но есть и другие, более простые, способы угробить браузер…
Я понимаю, что это перевод, но мне кажется статью можно сделать намного лучше, добавляя свои примечания по поводу во-первых хронологии (действительно, Опера появилась раньше нежели «переродившийся Файрфокс»), а во-вторых — вкраце — как изменялись веб-стандарты с течением времени (упоминаются только фреймы) и какие браузеры то или иное поддерживали. Тогда топик будет вообще блеск. Я сам в свое время замучился рыскать по википедии, выясняя что было раньше, а что позже и почему. :-) Если не хочется портить перевод, и тема вам интересна, напишите еще одну статью. Я не стебусь, я абсолютно серьезно.
Добавлю вам кармы в надежде, что вы это сделаете. :-) С уважением.
Времени у меня не густо, посмотрим :)
if (… IE....) {
} else if (… Mozilla....)
} else {
document.write('Извините, ваш браузер не поддерживается');
}
Например внутренняя привата24. Далее сайт показывается нормально, но строчка присутствует. Поэтому если придумать свой новый юзерагент, то получим эту надпись. А это антиреклама для непонимающих пользователей.
а что это означает? я не в курсе… :(
Opera 9.51, Linux
Safari 3.0, Windows
IE7, Windows
Firefox 3.0, MacOS
Теперь многое встало на свои места.
Еще раз спасибо за статью! и плюс в карму!
Долго думал, почему у всех браузеров юзер-агент начинается с Mozilla/x.0.
Какая максимальная длина поля User-Agent по стандарту?;)
А грамотное клиентское определение вообще не должно обращаться к UserAgent.
Все, наверное, видели старый бородатый способ либо сотни его вариаций (код на данный момент устарел, привёл просто в качестве примера):
isDOM=document.getElementById //DOM1 browser (MSIE 5+, Netscape 6, Opera 5+) isOpera=isOpera5=window.opera && isDOM //Opera 5+ isOpera6=isOpera && window.print //Opera 6+ isOpera7=isOpera && document.readyState //Opera 7+ isMSIE=document.all && document.all.item && !isOpera //Microsoft Internet Explorer 4+ isMSIE5=isDOM && isMSIE //MSIE 5+ isNetscape4=document.layers //Netscape 4.* isMozilla=isDOM && navigator.appName=="Netscape" //Mozilla или Netscape 6.*Вообще, определение сводится к ключевым проверкам:
1. Определение Оперы. Если существует window.opera, значит Opera
2. Определение Chrome (ненадёжно)document.all есть в FF, IE и Opera, т.е почти везде. Но попробуте в Chrome ввести в адресной строке javascript: alert(document.all).
3. Для IE есть решение «напролом»:
<![if IE 7]> <script> var IsIE=1 </script> <![endif]>4. Определение IE6. XMLHttpRequest работает в Opera, FF, IE7, Chrome. Но в IE6 его нет. (проверьте: javascript: alert(typeof XMLHttpRequest))
5. FF определяется чаще всего так: isMozilla=! isMSIE &&! isOpera. Решение «в лоб», ужасное, некрасивое, но для тех, кто верстает только под 3 браузера (часто этого хватает), сойдёт.
5.1 Определение FF возможно внутри кода обработки события: if (typeof e.offsetX == 'undefined') { isFF=1}
(но определение Chrome!===Определение Safari)
if (! e) e = window.event;
document.allв FF — оно там поддерживается в Quirks mode, по-моему, с 1.5, но проверкаif(document.all)всегда дает false — ради совместимости с проверками, написанными в эпоху NS6. А в строгом режиме его там нет ни в каком виде.try {
(new Function('return native'))();
}catch(e){ isChrome = 1 }
3. Не обязательно использовать conditional comments. Есть способ лучше
/*@cc_on@*//*@if (@_jscript_version) isIE=1 @end @*/
4. Пользуйтесь способом выше — @_jscript_version содержит версию javascript движка, каждая версия соответствует определенной версии IE. На msdn есть таблица соответствий.
5. Можно проверять gecko only свойства/методы, как например GeckoActiveXObject или window.atob()/window.btoa(). Последние еще в Netscape были, и насколько я знаю в других браузерах не встречаются.
Скоро в юзерагентах будут писать ACID совместимость:
User-Agent: ACID
User-Agent: ACID2
User-Agent: ACID3
PS: Они таки убили NCSA Mosaic…