Пользовательский агент: разбор PHP, browscap и нетрадиционные "браузеры"
Я ищу надежный способ узнать, какой пользовательский агент запрашивает мои страницы PHP. Я в курсе get_browser
так же как $_SERVER['HTTP_USER_AGENT']
но ни один не кажется надежным.
С get_browser
вам нужно установить директиву browscap PHP в ini-файл, определяющий пользовательские агенты. PHP рекомендует это - http://browsers.garykeith.com/downloads.asp - поэтому я установил "полный", указанный для LAMP.
Отлично работает с get_browser
для вашего обычного набора браузеров, но я специально занимаюсь запросами из MS Office. В этом случае, похоже, ничего не возвращается, как в OS X Excel (примечание: $_SERVER['HTTP_USER_AGENT']
первая строка, за которой следует вывод массива get_browser
):
Mozilla/5.0 (Macintosh; Intel Mac OS X) Excel/14.0.0
Array
(
[browser_name_regex] = ^.*$
[browser_name_pattern] = *
[browser] = Default Browser
[version] = 0
[majorver] = 0
[minorver] = 0
[platform] = unknown
[alpha] =
[beta] =
[win16] =
[win32] =
[win64] =
[frames] =
[iframes] =
[tables] =
[cookies] =
[backgroundsounds] =
[javascript] =
[vbscript] =
[javaapplets] =
[activexcontrols] =
[isbanned] =
[ismobiledevice] =
[issyndicationreader] =
[crawler] =
[cssversion] = 0
[aolversion] = 0
)
Что еще хуже, в некоторых случаях Windows даже не упоминается Office:
Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.1; WOW64; Trident/5.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0; .NET4.0C; .NET4.0E)
Array
(
[browser_name_regex] = ^mozilla/4\.0 (compatible; msie 7\.0.*; .*windows nt 6\.1.*).*$
[browser_name_pattern] = Mozilla/4.0 (compatible; MSIE 7.0*; *Windows NT 6.1*)*
[parent] = IE 7.0
[platform] = Win7
[browser] = IE
[version] = 7.0
[majorver] = 7
[win32] = 1
[frames] = 1
[iframes] = 1
[tables] = 1
[cookies] = 1
[backgroundsounds] = 1
[javascript] = 1
[vbscript] = 1
[javaapplets] = 1
[activexcontrols] = 1
[cssversion] = 2
[minorver] = 0
[alpha] =
[beta] =
[win16] =
[win64] =
[isbanned] =
[ismobiledevice] =
[issyndicationreader] =
[crawler] =
[aolversion] = 0
)
Судя по этим примерам, кажется, что get_browser
здесь на самом деле менее надежно, и больше информации можно получить из $_SERVER['HTTP_USER_AGENT']
который по крайней мере выплевывает кучу ссылок.NET для запросов Office.
Имея это в виду, может ли кто-нибудь указать мне на хорошо написанную функцию, которая ломает $_SERVER['HTTP_USER_AGENT']
? Каждый поиск, который я запустил, заканчивается рекомендациями для использования get_browser
вместо.
Любые мысли о том, почему get_browser
похоже, что вообще не удается ссылаться на MS Office из установок на основе Windows... вот 10 тестов различных пользователей, щелкающих ссылки в разных приложениях Office ($_SERVER
будет первый get_browser
результат): http://pastebin.com/5m2zWMrt - обратите внимание на отсутствие каких-либо признаков офиса после первых трех примеров из OS X. Я также задал связанный вопрос в MSDN: http://social.msdn.microsoft.com/Forums/en-US/officegeneral/thread/8ad594cd-0dfe-4110-8ffc-4d0caee4c29f
Подводя итог, я хотел бы получить краткосрочное решение с хорошим парсером $_SERVER['HTTP_USER_AGENT']
, в идеале тот, который может выяснить, поступает ли запрос из MS Office. В долгосрочной перспективе мне нужно выяснить, почему get_browser
не работает с MS Office, несмотря на наличие актуального ini-файла с данными Office.
1 ответ
Сервер просто не может правильно угадать, с каким браузером / приложением он обращается, поскольку предоставленные пользовательские агенты - как вы обнаружили для себя - ненадежны, если не сказать больше. Довольно просто написать анализатор пользовательского агента для наиболее используемых браузеров - но тогда, а об остальном? MS Office, например?
Так что нет, просто не пытайтесь угадать браузер со стороны сервера. Потому что это то, что ты делаешь, догадываясь - не зная.
В любом случае, зачем вам знать марку и модель браузера? Если вы хотите адаптировать страницу из-за того, какой браузер у пользователя, вы должны вместо этого использовать условные комментарии CSS и / или проверить, на какие функции можно положиться с помощью JavaScript. Будьте изобретательны и делайте все остальное, только не пытайтесь угадать браузер.