【问题标题】:How do I detect what browser is used to access my site?如何检测用于访问我的网站的浏览器?
【发布时间】:2010-09-12 09:15:36
【问题描述】:

我如何检测用户使用什么浏览器(IE、Firefox、Opera)访问我的网站? Javascript、PHP、ASP、Python、JSP 以及您能想到的任何其他示例都会有所帮助。是否有与语言无关的方法来获取此信息?

【问题讨论】:

  • 语言无关?从这些例子中,我想你已经有了答案。
  • 恕我直言,它似乎与stackoverflow.com/questions/100898/browser-detection完全相同
  • 弗兰克,那些语言的例子会很棒(尤其是 Javascript 和 PHP,对我来说),但我想知道是否有一种方法可以做到这一点,而不是特定于任何一种语言。跨度>
  • gizmo,感谢您的链接。我在询问之前进行了搜索,但该页面没有出现在结果中。

标签: http browser


【解决方案1】:

如果是用于处理请求,请查看传入请求的 User-Agent 标头。

更新:如果是用于报告,请配置您的网络服务器以将用户代理记录在访问日志中,然后运行日志分析工具,例如 AWStats

更新 2:仅供参考,通常(并不总是,通常)根据用户代理更改处理请求的方式是个坏主意。

【讨论】:

  • 我会说这总是一个坏主意;这只是有时唯一的解决方案
  • 那么目前处理移动设备和平板电脑的最佳方法是什么?
  • @Joe 我相信推荐的方法是使用CSS Media Queries。像往常一样,A List Apart 有一个relevant article
【解决方案2】:
【解决方案3】:

您可以查看他们发送的User-Agent。请注意,您可以发送您想要的任何代理,所以这不是 100% 万无一失的,但大多数人不会更改它,除非有特定原因。

【讨论】:

    【解决方案4】:

    一个快速而肮脏的 java servlet 示例

    private String getBrowserName(HttpServletRequest request) {
        // get the user Agent from request header
        String userAgent = request.getHeader(Constants.BROWSER_USER_AGENT);
        String BrowesrName = "";
        //check for Internet Explorer
        if (userAgent.indexOf("MSIE") > -1) {
            BrowesrName = Constants.BROWSER_NAME_IE;
        } else if (userAgent.indexOf(Constants.BROWSER_NAME_FIREFOX) > -1) {
            BrowesrName = Constants.BROWSER_NAME_MOZILLA_FIREFOX;
        } else if (userAgent.indexOf(Constants.BROWSER_NAME_OPERA) > -1) {
            BrowesrName = Constants.BROWSER_NAME_OPERA;
        } else if (userAgent.indexOf(Constants.BROWSER_NAME_SAFARI) > -1) {
            BrowesrName = Constants.BROWSER_NAME_SAFARI;
        } else if (userAgent.indexOf(Constants.BROWSER_NAME_NETSCAPE) > -1) {
            BrowesrName = Constants.BROWSER_NAME_NETSCAPE;
        } else {
            BrowesrName = "Undefined Browser";
        }
        //return the browser name
        return BrowesrName;
    }
    

    【讨论】:

    • 您是否保留“Browesr”以向后兼容旧系统? ;-)
    • 如果有 Netscape 的话,应该是相当老的脚本了 :)
    【解决方案5】:

    您可以在 ASP.NET 中使用 HttpBrowserCapabilities 类。这是来自link的示例

    private void Button1_Click(object sender, System.EventArgs e)
    {
            HttpBrowserCapabilities bc;
            string s;
            bc = Request.Browser;
            s= "Browser Capabilities" + "\n";
            s += "Type = " + bc.Type + "\n";
            s += "Name = " + bc.Browser + "\n";
            s += "Version = " + bc.Version + "\n";
            s += "Major Version = " + bc.MajorVersion + "\n";
            s += "Minor Version = " + bc.MinorVersion + "\n";
            s += "Platform = " + bc.Platform + "\n";
            s += "Is Beta = " + bc.Beta + "\n";
            s += "Is Crawler = " + bc.Crawler + "\n";
            s += "Is AOL = " + bc.AOL + "\n";
            s += "Is Win16 = " + bc.Win16 + "\n";
            s += "Is Win32 = " + bc.Win32 + "\n";
            s += "Supports Frames = " + bc.Frames + "\n";
            s += "Supports Tables = " + bc.Tables + "\n";
            s += "Supports Cookies = " + bc.Cookies + "\n";
            s += "Supports VB Script = " + bc.VBScript + "\n";
            s += "Supports JavaScript = " + bc.JavaScript + "\n";
            s += "Supports Java Applets = " + bc.JavaApplets + "\n";
            s += "Supports ActiveX Controls = " + bc.ActiveXControls + "\n";
            TextBox1.Text = s;
    }
    

    【讨论】:

      【解决方案6】:

      PHP 的预定义超全局数组 $_SERVER 包含一个键“HTTP_USER_AGENT”,它包含在 HTTP 请求中发送的 User-Agent 标头的值。 请记住,这是用户提供的数据,不可信任。 很少有用户会更改其用户代理字符串,但这种情况时有发生。

      【讨论】:

      • Big +1 提到用户代理不小心使用是不安全的
      【解决方案7】:

      在客户端,您可以使用 navigation.userAgent 对象在 Javascript 中执行此操作。这是一个粗略的例子:

      if (navigator.userAgent.indexOf("MSIE") > -1) 
      {
          alert("Internet Explorer!");
      }
      else if (navigator.userAgent.indexOf("Firefox") > -1)
      {
          alert("Firefox!");
      }
      

      可以在这里找到更详细和全面的示例:http://www.quirksmode.org/js/detect.html

      请注意,如果您为了 Javascript 兼容性而进行浏览器检测,通常最好简单地使用对象检测或 try/catch 块,以免某些您没想到的版本从您的裂缝中溜走脚本。 例如,不要这样做......

      if(navigator.userAgent.indexOf("MSIE 6") > -1)
      {
          objXMLHttp = new ActiveXObject("Microsoft.XMLHTTP");
      }
      else
      {
          objXMLHttp = new XMLHttpRequest();
      }
      

      ...这样更好:

      if(window.XMLHttpRequest) // Works in Firefox, Opera, and Safari, maybe latest IE?
      {
          objXMLHttp = new XMLHttpRequest();
      }
      else if (window.ActiveXObject) // If the above fails, try the MSIE 6 method
      {
          objXMLHttp = new ActiveXObject("Microsoft.XMLHTTP");
      }
      

      【讨论】:

        【解决方案8】:

        这可能取决于您的设置。在linux上使用apache,它写在访问日志/var/log/apache2/access_log

        【讨论】:

          【解决方案9】:

          您可以通过以下方式做到这一点:
          - 查看网络服务器日志,或者
          - 在处理之前查看 HTML 请求(纯文本流)中的 User-Agent 字段。

          【讨论】:

            【解决方案10】:

            首先,我想指出,最好避免针对特定的 Web 浏览器进行修补,除非作为最后结果 - 尝试实现跨浏览器兼容性,而不是使用符合标准的 HTML/CSS/JS (是的,javascript 确实有一个公分母子集,适用于所有主流浏览器)。

            话虽如此,HTTP 请求标头中的用户代理标记包含客户端的(已声明的)浏览器。尽管由于人们使用特定的浏览器而不是规范,这已经变得非常混乱,但确定真正的浏览器可能有点棘手。

            对此进行匹配:

            包含浏览器

            火狐->火狐

            MSIE -> Internet Explorer

            Opera -> Opera(少数几个不伪装成 Mozilla 的浏览器之一 :))

            大多数包含“bot”或“crawler”字样的代理通常是机器人(因此您可以从日志/等中省略它)

            【讨论】:

              【解决方案11】:

              查看browsecap.ini。链接的站点包含多种脚本语言的文件。 browsecap 不仅识别用户代理,还包含有关浏览器的 CSS 支持、JS 支持、操作系统、移动浏览器等信息。

              浏览到this page 以查看browsecap.ini 可以告诉您有关您当前浏览器的哪些信息的示例。

              【讨论】:

                猜你喜欢
                • 2018-03-22
                • 2021-09-14
                • 1970-01-01
                • 1970-01-01
                • 2012-05-10
                • 2018-04-11
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                相关资源
                最近更新 更多