Пользовательский агент: разбор PHP, browscap и нетрадиционные "браузеры" - PullRequest
0 голосов
/ 15 ноября 2011

Я ищу надежный способ узнать, какой пользовательский агент запрашивает мои страницы 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 Ответ

0 голосов
/ 15 ноября 2011

Сервер просто не может правильно угадать, с каким браузером / приложением он общается, поскольку предоставленные пользовательские агенты - как вы обнаружили для себя - ненадежны, если не сказать больше. Довольно просто написать анализатор пользовательского агента для большинства используемых браузеров - но тогда, а об остальном? MS Office, например?

Так что нет, просто не пытайтесь угадать браузер со стороны сервера. Потому что это то, что ты делаешь, догадываясь - не зная.

Зачем вам в любом случае знать марку и модель браузера? Если вы хотите адаптировать страницу из-за того, какой браузер у пользователя, вы должны вместо этого использовать условные комментарии CSS и / или тестировать, на какие функции можно положиться с помощью JavaScript. Будьте изобретательны и делайте все остальное, только не пытайтесь угадать браузер.

...