【问题标题】:Mobile browser detection with .htaccess fails with Opera MiniOpera Mini 使用 .htaccess 检测移动浏览器失败
【发布时间】:2012-06-07 16:13:42
【问题描述】:

我很难弄清楚这一点。我正在尝试通过 HTACCESS 用户代理嗅探将移动流量引导到网站的移动版本,如下所示:

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 解释器,我才能够阅读这些信息。我想我只是不明白它是如何工作的。

无论如何,我从 Internet 搜索中借用了代码,并将其放入库函数中:

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]

如您所见,我只是为移动设备重定向明确的呼叫。子域,以及那些不包含在打包程序过程中保留$view 集的cookie。


我的初衷是专门使用 HTACCESS 执行浏览器检测;因为简单并且在 mod_rewrite 强大的前提下。但在我的挫折中,为了赶上最后期限,我妥协了,选择了一种更粗的方法,将来可能需要更多的维护。

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

感谢收看。

【问题讨论】:

  • 如果您能分享发生这种情况的网站的地址将会很有用。
  • 网址为www.buffalosbigdeal.com,手机版为mobile.buffalosbigdeal.com。
  • 请务必针对 Opera 桌面进行测试。 'oper' 似乎不是一个好主意;)
  • 好收获。但我认为上述条件应该已经通过检查 HTTP_X_WAP_PROFILE 或 WAP HTTP_ACCEPT 的存在来验证浏览器为“移动”。
  • 您的代码是一系列 if 不是一系列 if/else if/then。因此,所有条件都经过测试并最终应用。 :)

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


【解决方案1】:

注意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

【讨论】:

  • 奇怪,您的解决方案不仅有效,而且如果我将第一个条件字符串 mobi 替换为 miniopera 它也得到了验证!我想知道我的 HTACCESS 文件中的其他内容是否导致冲突。无论如何,即使我没有使用它,我也会接受你的回答,因为它有效!
  • @vBuck 不能只替换为 Opera,因为您也会捕获所有桌面用户。 :)
【解决方案2】:

应该是 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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-07-13
    • 1970-01-01
    • 2011-10-01
    • 2019-10-09
    • 1970-01-01
    • 1970-01-01
    • 2011-04-18
    • 2015-09-26
    相关资源
    最近更新 更多