Home > Software > Oprea的怪异识别码
2009November . 17th

Oprea的怪异识别码

我打算重新设计一个博客引导页,在里面设计一个小彩蛋。通过PHP识别访客所用的浏览器,并输出不同的欢迎语。省时起见,在网上搜索了一段代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
if(strpos($_SERVER["HTTP_USER_AGENT"],"MSIE 8.0"))
echo "MSIE 8";
else if(strpos($_SERVER["HTTP_USER_AGENT"],"MSIE 7.0"))
echo "MSIE 7";
else if(strpos($_SERVER["HTTP_USER_AGENT"],"MSIE 6.0"))
echo "MSIE 6";
else if(strpos($_SERVER["HTTP_USER_AGENT"],"Firefox/3"))
echo "Firefox 3";
else if(strpos($_SERVER["HTTP_USER_AGENT"],"Firefox/2"))
echo "Firefox 2";
else if(strpos($_SERVER["HTTP_USER_AGENT"],"Chrome"))
echo "Google Chrome";
else if(strpos($_SERVER["HTTP_USER_AGENT"],"Safari"))
echo "Safari";
else if(strpos($_SERVER["HTTP_USER_AGENT"],"Opera"))
echo "Opera";
else echo $_SERVER["HTTP_USER_AGENT"];


这段代码的意思是根据浏览器识别码来控制输出的内容,在IE、Firefox,甚至Oprea9里都测试正常,可是用Opera10测试时却返回了Opera/9.80 (Windows NT 5.1; U; zh-cn) Presto/2.2.15 Version/10.00也就是浏览器的原始识别码(其实这段代码可以在Opera地址栏里输入“opera:about”看到)。换句话说,上面那段程序不能正确检测出Opera10。
Opera10有个很奇怪的地方,大家留意一下返回的代码,会发现Opera是9.80,但Version却是10.00。
这里面有个小故事:

Opera 的工程师在测试中发现,Opera 10 Alpha 在很多老网站上的运作很不正常。原来,有很多网站使用了“浏览器嗅探”技术,也就是说网站会针对不同的浏览器提供不同的内容或功能。然而不幸的是,这些网站无法识别两位数的浏览器版本号,于是 Opera 就成了首当其冲的受害者——它们把 Opera 10.0 误认为是 Opera 1.0,并因此向 Opera 10 提供不完整的功能,甚至有些网站干脆拒绝 Opera 10 的访问。
这当然是 Opera 不愿意看到的。于是,Opera 的工程师们决定,将用户代理信息中的版本号定格在 9.8,并另外启用 Version 字段来标识真正的版本号。当然他们也考虑过选用 9.99 这个最接近 10 的可用作版本号的数字,不过出于预留空间的考虑,最终还是决定采用 9.8 作为象征性的版本号——它正好介于(Opera 9 的最后一个版本号)9.6 与 10 之间。

于是我开始修改程序,却发现用Opera/9.80也无法识别出Opera10.
经过几次修改和测试,我最后采用了以下方法识别Opera10。

1
2
else if(strpos($_SERVER["HTTP_USER_AGENT"],"Version/10.00"))
echo "Opera 10";

可是这个方法有一个极大的弊端,就是Opera10升级到10.XX就不能使用了。谁能告诉我在PHP里,应该怎么识别Opera10呢?

  1. 2009November . 17th - 3:59 PM

    opera现在我没怎么用了

  2. 2009November . 17th - 7:58 PM

    呵呵。
    出第十版了?升级挺快。

  3. 2009November . 17th - 8:05 PM

    我也没用过

  4. 2009November . 17th - 9:49 PM

    Opera用过一段时间,还是不习惯,,,

  5. 2009November . 18th - 8:56 AM

    呵呵一直都没注意过浏览器识别问题,这次算是涨知识了

  6. 2009November . 18th - 9:40 AM

    我也基本不用opera

  7. 2009November . 18th - 10:54 AM

    出现一个课题了

  8. 2009November . 18th - 1:06 PM

    oprea10挺好用的。

  9. 2009November . 18th - 1:32 PM

    一直在用ff

  10. 2009November . 18th - 1:50 PM

    现在很少用这个浏览器了

  11. 2009November . 18th - 4:57 PM

    以前用得多,现在用得少了,感觉不好用,

  12. 2009November . 18th - 6:08 PM

    现在我都是用chrome,哎,围观并飘过,等牛人解答你的问题啦

  13. 2009November . 18th - 6:54 PM

    用Chrome以后firefox就好久没工作过了,浏览器我还是喜欢简简单单的…

  14. 2009November . 18th - 8:15 PM
    yinheli

    考虑用正则表达式

  15. 2009November . 18th - 8:35 PM
    yinheli
    if( preg_match('/Opera.*Version\/10/', $_SERVER['HTTP_USER_AGENT']) ){
    	echo 'Opera 10';
    }
  16. 2009November . 18th - 8:41 PM

    @yinheli
    终于有高手解答了,谢谢。我要恶补一下正则了

  17. 2009November . 18th - 9:02 PM

    为什么要欢迎语呢?

  18. 2009November . 18th - 10:04 PM

    这个问题也是出于无奈

    其实选择9.8不止是因为这个数字介于9.6和10之间
    也是为以后的版本留点空间,这种状况估计短时间不会改变
    10.10过后的下一代可能是9.85

  19. 2009November . 18th - 10:05 PM

    现在的Opera最新正式版是10.01 1844
    最新测试版是10.10 1880
    所以你那个方法显然不行。。可惜我不会php,帮不上忙

  20. 2009November . 18th - 10:42 PM

    不懂这个 帮不上忙

  21. 2009November . 19th - 12:56 PM

    确实不怎么习惯使用这个浏览器

  22. 2009November . 19th - 5:47 PM

    Opera10这个就火星了…

  23. 2009November . 20th - 12:24 AM

    这是什么玩意?怎么看不懂?

  24. 2009November . 20th - 4:20 AM

    来顶顶

  25. 2009November . 20th - 1:14 PM

    你技术越来越娴熟了。

  26. 2009November . 22nd - 5:02 PM

    太专业太复杂,我只能说我是来灌的,飘~~~

  27. 2009November . 27th - 9:56 PM

    @网络生活 我现在也基本不用OP,基本用FF。

  28. 2009December . 8th - 12:25 AM

    真是一个小细节,是不是说明Opera太老了?还是太先进了呢?看来高版本也不一定是件福因。呵呵

Subscriber selector

Close