使用Opera Mini的.htaccess移动浏览器检测失败

时间:2012-06-07 16:13:42

标签: .htaccess mod-rewrite browser opera user-agent

我很难搞清楚这一个。我正试图通过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?

感谢您的期待!


更新时间: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;
}

此函数作为网站的strapper进程的一部分调用,以便在输出任何内容之前,返回$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]

正如您所看到的,我只是重定向移动设备的显式调用。子域名,以及那些不包含在暂停过程中保留$view集合的cookie的域名。


我的初衷是使用HTACCESS独家执行浏览器检测;因为简单而且在mod_rewrite的力量的前提下。但是,由于我的沮丧,并且为了达到最后期限,我通过解决一个更加粗巧的方法而妥协,可能需要在将来进行更多的维护。

经验教训:根据浏览器功能(即:分辨率,触摸和DOM级别)构建响应式网站,并且不要过多依赖用户代理字符串。我们还有这样的解决方案吗?

感谢您的光临。

2 个答案:

答案 0 :(得分:3)

请注意,Opera Mini字符串的模式为

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

Mini是大写的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

答案 1 :(得分:0)

应该是 if(strpos(strtolower($ _ SERVER ['HTTP_USER_AGENT']),'operamini')> 0)

或应该是 if(strpos(strtolower($ _ SERVER ['ALL_HTTP']),'operamini')> 0)

我使用ALL_HTTP收到调试错误,但是当我使用HTTP_USER_AGENT

时错误就消失了

以下是调试错误,如下所示: 调试通知:未定义索引:第29行header.php中的ALL_HTTP

相关问题