【问题标题】:How to filter access by User Browser type and version如何按用户浏览器类型和版本过滤访问
【发布时间】:2017-07-15 00:41:52
【问题描述】:

我的问题基于:

我使用 PHP、AJAX、Javascript、CSS 等构建的 Web 应用程序 不真正支持旧/真正旧的浏览器。一些功能/风格 旧版浏览器可能无法运行。

所以我的主要问题是:

如何根据浏览器类型(IE、 Mozilla、Chrome 等)和 PHP/JavaScript/AJAX 的浏览器版本?

【问题讨论】:

  • 什么样的限制?
  • 请记住,您提出的任何解决方案都可以被绕过,因为它将基于用户报告的内容。
  • 这一切都在 PHP 文档中可用。
  • 在提问之前总是做大量的研究。这有助于减少 SO 的膨胀。 99.9% 的情况下,您梦寐以求的任何问题都已经在 SO 上得到了回答。

标签: javascript php jquery css ajax


【解决方案1】:

PHP手册get_browser()

列出有关用户浏览器的所有信息

<?php
echo $_SERVER['HTTP_USER_AGENT'] . "\n\n";

$browser = get_browser(null, true);
print_r($browser);
?>

示例:-

<?php
function getBrowser()
{
    $u_agent = $_SERVER['HTTP_USER_AGENT'];
    $bname = 'Unknown';
    $platform = 'Unknown';
    $version= "";

    //First get the platform?
    if (preg_match('/linux/i', $u_agent)) {
        $platform = 'linux';
    }
    elseif (preg_match('/macintosh|mac os x/i', $u_agent)) {
        $platform = 'mac';
    }
    elseif (preg_match('/windows|win32/i', $u_agent)) {
        $platform = 'windows';
    }

    // Next get the name of the useragent yes seperately and for good reason
    if(preg_match('/MSIE/i',$u_agent) && !preg_match('/Opera/i',$u_agent))
    {
        $bname = 'Internet Explorer';
        $ub = "MSIE";
    }
    elseif(preg_match('/Firefox/i',$u_agent))
    {
        $bname = 'Mozilla Firefox';
        $ub = "Firefox";
    }
    elseif(preg_match('/Chrome/i',$u_agent))
    {
        $bname = 'Google Chrome';
        $ub = "Chrome";
    }
    elseif(preg_match('/Safari/i',$u_agent))
    {
        $bname = 'Apple Safari';
        $ub = "Safari";
    }
    elseif(preg_match('/Opera/i',$u_agent))
    {
        $bname = 'Opera';
        $ub = "Opera";
    }
    elseif(preg_match('/Netscape/i',$u_agent))
    {
        $bname = 'Netscape';
        $ub = "Netscape";
    }

    // finally get the correct version number
    $known = array('Version', $ub, 'other');
    $pattern = '#(?<browser>' . join('|', $known) .
    ')[/ ]+(?<version>[0-9.|a-zA-Z.]*)#';
    if (!preg_match_all($pattern, $u_agent, $matches)) {
        // we have no matching number just continue
    }

    // see how many we have
    $i = count($matches['browser']);
    if ($i != 1) {
        //we will have two since we are not using 'other' argument yet
        //see if version is before or after the name
        if (strripos($u_agent,"Version") < strripos($u_agent,$ub)){
            $version= $matches['version'][0];
        }
        else {
            $version= $matches['version'][1];
        }
    }
    else {
        $version= $matches['version'][0];
    }

    // check if we have a number
    if ($version==null || $version=="") {$version="?";}

    return array(
        'userAgent' => $u_agent,
        'name'      => $bname,
        'version'   => $version,
        'platform'  => $platform,
        'pattern'    => $pattern
    );
}

// now try it
$ua=getBrowser();
$yourbrowser= "Your browser: " . $ua['name'] . " " . $ua['version'] . " on " .$ua['platform'] . " reports: <br >" . $ua['userAgent'];
print_r($yourbrowser);
?>

【讨论】:

    【解决方案2】:

    使用 Javascript,您可以这样做以获取用户正在使用的浏览器以及他们当前使用的浏览器版本。

    <script type="text/javascript">
            function browserDetails() {
                var user_agent = navigator.userAgent,
                    tem, M = user_agent.match(/(opera|chrome|safari|firefox|msie|trident(?=\/))\/?\s*(\d+)/i) || [];
                if (/trident/i.test(M[1])) {
                    tem = /\brv[ :]+(\d+)/g.exec(user_agent) || [];
                    return {
                        name: 'IE ',
                        version: (tem[1] || '')
                    };
                }
                if (M[1] === 'Chrome') {
                    tem = user_agent.match(/\bOPR\/(\d+)/)
                    if (tem != null) {
                        return {
                            name: 'Opera',
                            version: tem[1]
                        };
                    }
                }
                M = M[2] ? [M[1], M[2]] : [navigator.appName, navigator.appVersion, '-?'];
                if ((tem = user_agent.match(/version\/(\d+)/i)) != null) {
                    M.splice(1, 1, tem[1]);
                }
                return {
                    name: M[0],
                    version: M[1]
                };
            }
        
                //display browser
            var browser = browserDetails();
            console.log(browser.name);
            console.log(browser.version);
        </script>

    注意:上面的代码没有检测到 Microsoft Edge,你需要研究如何检测用户是否在使用 Edge,然后实现 使用上面的代码。

    如果你想获得一个特定的浏览器名称和版本,你会这样做。

    var browser=browserDetails();
        if(browser.name == 'Chrome' && browser.version <= 28)
            {
                // then do your restrictions
            }else{
    
                // do something
            }
    

    PS: 这也适用于 IE 波纹管截图

    【讨论】:

    • name: 'IE' 空格太多?
    • 你可以减少空白,但我确实测试过它确实有效
    • @Michael 用 IE 的屏幕截图查看我的更新答案,你用的是什么 IE?
    • 我认为是 MSIE 8。
    • 还是没有检测到?
    猜你喜欢
    • 2021-04-26
    • 2011-09-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-12
    • 2016-09-20
    • 2016-10-19
    • 2018-09-14
    相关资源
    最近更新 更多