#web

Данная статья является частичным переводом поста “History of the browser user-agent string” с сайта WebAIM. Некоторые ссылки, указанные в статье, на данный момент уже недоступны, поэтому мне пришлось их изменить (в частности, ссылаться на архив Интернета). В некоторых местах я даю перевод английских слов и дополнения; также в конце присутствует дополнительное послесловие.

Mosaic

Mosaic

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

Но вот явился новый браузер, известный как Mozilla — сие означало “Mosaic Killer”. Однако не был Mosaic доволен сим именем, и изменено было оно на Netscape, и поименовал Netscape себя Mozilla/1.0 (Win3.1), и ещё более возрадовались люди. Netscape поддерживал фреймы, и популярны стали фреймы среди народа. Но — увы! — не поддерживал Mosaic фреймы, и так зародился “анализ строки user agent”, и слали вебмастеры фреймы для Mozilla, однако ж не слали браузерам опричным.

Это действительно очень далёкие времена по меркам веба. Тогда разработчики использовали <frameset> и <frame>, чтобы разделять окно браузера на независимые области — например, помещали в одну меню, а в другую основной контент. Сегодня эти элементы давно устарели, хотя их родственник <iframe> никуда не делся и активно используется.

И возвестил Netscape: будем же насмехаться над Microsoft, именуя Windows “плохо отлаженными драйверами для устройств”, и злобу великую затаил Microsoft. Сотворил Microsoft собственный браузер, окрестив его Internet Explorer, лелея надежду, что станет он “Netscape Killer”.

Кстати, Microsoft не разрабатывала самый первый Internet Explorer совсем уж с нуля: в его основе лежала технология Spyglass Mosaic. Так что родословная браузеров оказалась ещё более запутанной, чем можно подумать.

И поддерживал Internet Explorer фреймы, но не был он Mozilla и посему фреймов не получал. И не утерпел Microsoft, не желая ждать, пока все вебмастеры королевства прознают об IE и станут слать фреймы и для него. И тогда объявил себя Internet Explorer “Mozilla compatible” (совместимый с Mozilla) и стал выдавать себя за Netscape, поименовавшись Mozilla/1.22 (compatible; MSIE 2.0; Windows 95). И стал Internet Explorer получать фреймы во множестве, и счастлив был весь Microsoft, но смятение зародилось среди вебмастеров.

И продавал Microsoft свой IE вместе с Windows, и сделал его более могучим, чем Netscape, и так разразилась на земле первая браузерная война. И, узрите, повержен был Netscape, и великая радость воцарилась в Microsoft. Но возродился Netscape под именем Mozilla аки Феникс из пепла, и создал Mozilla Gecko, поименовав его Mozilla/5.0 (Windows; U; Windows NT 5.0; en-US; rv:1.1) Gecko/20020826, и был Gecko движком для рендеринга, и был он диво как хорош. И стал Mozilla Firefox, назвавшись Mozilla/5.0 (Windows; U; Windows NT 5.1; sv-SE; rv:1.7.5) Gecko/20041108 Firefox/1.0, и был Firefox хорош на загляденье. И стал Gecko плодиться и размножаться, народились из кода его браузеры иньшие, и именовали они себя по батюшке 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, притворяясь Mozilla, и все они использовали Gecko.

И был Gecko хорош, а IE хорош не был, и вновь возвернулся анализ user agent, и подавали Gecko добрый код, а иньшим браузерам — нет. И безмерно опечалены были последователи Linux, ибо породили они Konqueror, движком коего был KHTML, и мыслили они, что он также славен, как Gecko, но не был он Gecko и посему хороших веб-страниц не получал. И от того порешил Konqueror сделаться “like Gecko” (как Gecko), дабы получать хорошие веб-страницы, и поименовался он Mozilla/5.0 (compatible; Konqueror/3.2; FreeBSD) (KHTML, like Gecko), и породило это замешательство великое.

Следом явилась Opera и возвестила: “желаем мы, чтобы пользователи наши были вольны выбирать, какой браузер будем мы имитировать”, и создала Opera особый пункт меню, и именовала себя 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), согласно воле пользователя.

А с версии 10 не стала более Opera притворяться Mozilla, однако ж стала притворяться Opera 9.8: Opera/9.80 (Macintosh; Intel Mac OS X; U; en) Presto/2.2.15 Version/10.00.

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

И устрашился Microsoft ворога своего Firefox, и потому вернулся Internet Explorer, и поименовал он себя Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.0), и обладал он умением рендерить хороший код, но лишь когда приказывали ему вебмастеры.

Затем же Google породил Chrome, и использовал Chrome WebKit, и был он аки Safari, и желал такие же страницы, как и Safari, посему выдавал себя за Safari. И от того, что Chrome использовал WebKit, и выдавал себя за Safari, а WebKit выдавал себя за KHTML, а KHTML притворялся Gecko, а все браузеры притворялись Mozilla, взял себе Chrome витиеватое имя 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. И обернулась строка user agent полнейшей неразберихой, и стала почти бесполезною, и все лицедействовали, выдавая себя за других, и великое замешательство осталось.

Послесловие: и что же случилось дальше?

С тех славных времён минуло немало лет, браузеры успели несколько раз переродиться, а строка User-Agent… ну, скажем так, отнюдь не стала проще.

В 2013 году Google отделил от WebKit новый движок Blink, который стал использоваться в Chrome и других браузерах на основе Chromium. Microsoft тем временем похоронила Internet Explorer, разработала Edge, а затем и сама перевела его на Chromium. И продолжилось великое браузерное переселение народов.

Но самое прекрасное, что стародавние имена никуда не исчезли. Даже современные версии Chrome могут представляться строкой, в которой одновременно упоминаются Mozilla/5.0, AppleWebKit, KHTML, like Gecko, Chrome и Safari. Ибо зачем отказываться от древних обычаев, когда можно продолжать тысячелетнее лицедейство?..

Правда, появилась и новая проблема: подробные сведения о браузере, операционной системе и устройстве можно использовать для отслеживания пользователей. Поэтому разработчики Chrome и других браузеров начали сокращать информацию в User-Agent. Например, вместо точной версии операционной системы или модели устройства могут передаваться условные значения, а некоторые компоненты номера версии браузера заменяются нулями.

Для случаев, когда серверу действительно нужны дополнительные сведения, появился механизм User-Agent Client Hints. Он позволяет получать определённую информацию через специальные HTTP-заголовки, хотя поддерживается не всеми браузерами одинаково.

Ну а разработчикам стоит помнить главное: пытаться определить возможности браузера исключительно по его User-Agent — занятие сомнительное. Гораздо надёжнее проверять поддержку конкретной функции, а не гадать, кто там скрывается под очередной маской.

Ибо сказано было: не верь тому, кто именует себя Mozilla, ибо может оказаться он кем угодно.