Вопрос по browser, user-agent, mod-rewrite, opera, .htaccess – Обнаружение мобильного браузера с помощью .htaccess не удается с Opera Mini

1

У меня проблемы с выяснением этого. Я пытаюсь направить мобильный трафик на мобильную версию веб-сайта через анализатор HTACCESS User-Agent, например, так:

RewriteCond %{HTTP_USER_AGENT} (android|blackberry|ipad|iphone|ipod|iemobile|mini|mobi|palmos|webos|googlebot\-mobile) [NC]
RewriteCond %{HTTP_HOST} ^mobile\.mywebsite\.com$
RewriteRule ^([aA0-zZ9\-\/]*)/([^/]*)$ /index.php?page=$1&q=$2&q2=$3&setview=mobile [L,QSA]

Строкаmini|mobi где браузер Opera Mini должен быть обнаружен. Однако этого не происходит. Я также изменил эту строку наopera m и другие варианты. Все еще не повезло.

Это условие перезаписи работает с другими мобильными браузерами, но не с Opera, и я не понимаю, почему. Даже второе условие, которое проверяет явный указатель наmobile. субдомен также не может доставить мобильный контент.

Я не гуру HTACCESS, поэтому я считаю, что мой синтаксис неверен. Но почему это работает на других мобильных браузерах, а не на Opera Mini?

Спасибо за внимание!

UPDATE: 2012-06-08

Я фактически прибег к другому методу, используя PHP для проверки заголовков. По какой-то причине мой файл HTACCESS не обнаружил определенную информацию заголовка. Даже если ответ karlcow будет подтвержден, у меня возникли проблемы с проверкой браузеров iPhone и Android сторонних производителей. Только когда страница была передана интерпретатору PHP, я смог прочитать информацию. Полагаю, я просто не понимаю, как это работает.

Во всяком случае, я позаимствовал код из поиска в Интернете, который я поместил в библиотечную функцию:

function get_device_view() {    
    $view='desktop';
    if(preg_match('/(up.browser|up.link|mmp|symbian|smartphone|midp|wap|phone|android)/i', strtolower($_SERVER['HTTP_USER_AGENT'])))
        $view='mobile';
    if((strpos(strtolower($_SERVER['HTTP_ACCEPT']),'application/vnd.wap.xhtml+xml')>0) || ((isset($_SERVER['HTTP_X_WAP_PROFILE']) || isset($_SERVER['HTTP_PROFILE']))))
        $view='mobile';
    $mobile_ua=strtolower(substr($_SERVER['HTTP_USER_AGENT'],0,4));
    $mobile_agents=array(
        'w3c ','acs-','alav','alca','amoi','audi','avan','benq','bird','blac',
        'blaz','brew','cell','cldc','cmd-','dang','doco','eric','hipt','inno',
        'ipaq','java','jigs','kddi','keji','leno','lg-c','lg-d','lg-g','lge-',
        'maui','maxo','midp','mits','mmef','mobi','mot-','moto','mwbp','nec-',
        'newt','noki','oper','palm','pana','pant','phil','play','port','prox',
        'qwap','sage','sams','sany','sch-','sec-','send','seri','sgh-','shar',
        'sie-','siem','smal','smar','sony','sph-','symb','t-mo','teli','tim-',
        'tosh','tsm-','upg1','upsi','vk-v','voda','wap-','wapa','wapi','wapp',
        'wapr','webc','winw','winw','xda ','xda-');
    if(in_array($mobile_ua,$mobile_agents))
        $view='mobile';
    if (strpos(strtolower($_SERVER['ALL_HTTP']),'OperaMini')>0)
        $view='mobile';
    if(strpos(strtolower($_SERVER['HTTP_USER_AGENT']),'windows')>0)
        $view='desktop';
    return $view;
}

Эта функция вызывается как часть процесса загрузки для веб-сайта, так что, прежде чем что-либо выводится,$view возвращается, так что загружаются соответствующие страницы и таблицы стилей.

Кроме того, я изменил свой файл HTACCESS, чтобы он содержал следующее:

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{HTTP_COOKIE} !((^|;\s*)DD_VIEW=([^;]+))
RewriteCond %{HTTP_HOST} mobile\.buffalosbigdeal\.com
RewriteRule ^([aA0-zZ9\-\/]*)/*([^/]*)$ /index.php?page=$1&q=$2&q2=$3&setview=mobile [L,QSA]

Как видите, я только перенаправляю явные вызовы на мобильный телефон. субдомен, и те, которые не содержат cookie, который сохраняет$view установить во время процесса стриппера.

Моим первоначальным намерением было выполнить обнаружение браузера исключительно с использованием HTACCESS; из-за простоты и в соответствии с мощью mod_rewrite. Но из-за моего разочарования и из-за того, что я уложился в срок, я пошел на компромисс, выбрав более громоздкий метод, который в будущем может потребовать дополнительного обслуживания.

Lesson learned: Создавайте адаптивные веб-сайты на основе возможностей браузера (т. Е. Разрешения, касания и уровня DOM) и не в значительной степени полагайтесь на строки агента пользователя. У нас еще есть решение, подобное этому?

Спасибо за поиск.

Хороший улов. Но я думаю, что вышеупомянутое условие уже должно было подтвердить браузер как «мобильный» проверив наличиеHTTP_X_WAP_PROFILE или WAPHTTP_ACCEPT. Rick Buczynski
пожалуйста, не забудьте протестировать на рабочем столе Opera. & APOS; Опер & APOS; похоже, не очень хорошая идея;) karlcow
Адрес веб-сайта: www.buffalosbigdeal.com с мобильной версией на mobile.buffalosbigdeal.com. Rick Buczynski
Ваш код - это серия, если не серия if / else if / then. Таким образом, все условия проверены и в конечном итоге применяются. :) karlcow
было бы полезно, если бы вы могли поделиться адрес веб-сайта, где это происходит. karlcow

Ваш Ответ

2   ответа
0

Должно ли это быть if (strpos (strtolower ($ _ SERVER ["HTTP_USER_AGENT"]), "operamini") & gt; 0)

или это должно быть if (strpos (strtolower ($ _ SERVER ["ALL_HTTP"]), "operamini") & gt; 0)

Я получаю ошибку отладки, используя ALL_HTTP, но ошибка исчезает, когда я использую HTTP_USER_AGENT

Вот ошибка отладки следующим образом: Уведомление об отладке: неопределенный индекс: ALL_HTTP в header.php в строке 29

3

Opera/9.80 (J2ME/MIDP; Opera Mini/$CLIENT_VERSION/$SERVER_VERSION; U; $LANGUAGE) Presto/$PRESTO_VERSION

Мини с заглавной буквы M. Хмм, но вы поставили NC, который предназначен для nocase, так что это не так. Просто чтобы быть уверенным, ты можешь попробовать

RewriteCond %{HTTP_USER_AGENT} (android|blackberry|ipad|iphone|ipod|iemobile|mobi|palmos|webos|googlebot\-mobile) [NC,OR]
RewriteCond %{HTTP_USER_AGENT} Opera\ Mini
@vBuck не заменяйте только оперой, потому что вы также поймаете всех пользователей рабочего стола. :)
Странно, не только ваше решение работало, но и если я заменил первую строку условияmobi сmini или жеopera это также подтверждено! Мне интересно, если что-то еще в моем файле HTACCESS вызывало конфликты. В любом случае, я приму ваш ответ, даже если я его не использовал, потому что он работает! Rick Buczynski

Похожие вопросы