【问题标题】:Obtaining browser and version using Coldfusion使用 Coldfusion 获取浏览器和版本
【发布时间】:2011-06-09 14:59:53
【问题描述】:

Coldfusion 中是否有内置的东西可以让我知道浏览我的网站的浏览器和版本号?是否有现有的库可以让我做到这一点?

除了检测 IE 的简单 if 语句之外,我的 google-fu 没有显示很多东西。

我确实在 Chrome 中转储了 cgi.http_user_agent 变量:

Mozilla/5.0 (Windows NT 5.1) AppleWebKit/534.24 (KHTML, like Gecko) Chrome/11.0.696.77 Safari/534.24

里面提到了三种不同的浏览器!执行 if 语句查找其中任何一个都将返回 true。一定有更正式的方法吗?

【问题讨论】:

  • 同意。我只是想在 Coldfusion 中复制一个 JS 组件。浏览器嗅探只是其功能的一小部分。
  • 这实际上并不是说三个浏览器。 AppleWebKit 部分只是说您正在使用构建在 WebKit 渲染引擎上的浏览器(Safari 部分说的是同样的事情)。我一直不确定 Mozilla 部分是什么,但唯一告诉你浏览器的部分是 Chrome 和它所在的版本。在检查 Chrome 时,您可能只想检查 AppleWebKit,因为大多数 webkit 浏览器都支持相同的东西。

标签: coldfusion user-agent


【解决方案1】:

这比之前提交的复杂函数简单多了……

<CFIF FindNoCase('Chrome','#CGI.HTTP_USER_AGENT#') GREATER THAN 0>
  <CFSET browser = 'Chrome'>
</CFIF>

信用:http://www.paulsilver.co.uk/code/coldfusion_detect_browser.php

【讨论】:

    【解决方案2】:

    你能不改用javascript吗? http://cssuseragent.org/

    CSSUA 很棒,为标签添加了简单的类,并允许您使用 ua-ie-6 等类在 CSS/Javascript 中定位内容

    【讨论】:

    • 这是我遇到的最好的解决方案
    【解决方案3】:

    有一个用户定义的函数可以解析出user_agent字符串。

    browserDetect

    <cfscript>
    /**
     * Detects 130+ browsers.
     * v2 by Daniel Harvey, adds Flock/Chrome and Safari fix.
     * 
     * @param UserAgent      User agent string to parse. Defaults to cgi.http_user_agent. (Optional)
     * @return Returns a string. 
     * @author John Bartlett (jbartlett@strangejourney.net) 
     * @version 4, June 28, 2009 
     */
    function browserDetect() {
    
    // Default User Agent to the CGI browser string
    var UserAgent=CGI.HTTP_USER_AGENT;
    
    // Regex to parse out version numbers
    var VerNo="/?v?_? ?v?[\(?]?([A-Z0-9]*\.){0,9}[A-Z0-9\-.]*(?=[^A-Z0-9])";
    
    // List of browser names
    var BrowserList="";
    
    // Identified browser info
    var BrowserName="";
    var BrowserVer="";
    
    // Working variables
    var Browser="";
    var tmp="";
    var tmp2="";
    var x=0;
    
    
    // If a value was passed to the function, use it as the User Agent
    if (ArrayLen(Arguments) EQ 1) UserAgent=Arguments[1];
    
    // Allow regex to match on EOL and instring
    UserAgent=UserAgent & " ";
    
    // Browser List (Allows regex - see BlackBerry for example)
    BrowserList="1X|Amaya|Ubuntu APT-HTTP|AmigaVoyager|Android|Arachne|Amiga-AWeb|Arora|Bison|Bluefish|Browsex|Camino|Check&Get|Chimera|Chrome|Contiki|cURL|Democracy|" &
                "Dillo|DocZilla|edbrowse|ELinks|Emacs-W3|Epiphany|Galeon|Minefield|Firebird|Phoenix|Flock|IceApe|IceWeasel|IceCat|Gnuzilla|" &
                "Google|Google-Sitemaps|HTTPClient|HP Web PrintSmart|IBrowse|iCab|ICE Browser|Kazehakase|KKman|K-Meleon|Konqueror|Links|Lobo|Lynx|Mosaic|SeaMonkey|" &
                "muCommander|NetPositive|Navigator|NetSurf|OmniWeb|Acorn Browse|Oregano|Prism|retawq|Shiira Safari|Shiretoko|Sleipnir|Songbird|Strata|Sylera|" &
                "ThunderBrowse|W3CLineMode|WebCapture|WebTV|w3m|Wget|Xenu_Link_Sleuth|Oregano|xChaos_Arachne|WDG_Validator|W3C_Validator|" &
                "Jigsaw|PLAYSTATION 3|PlayStation Portable|IPD|" &
                "AvantGo|DoCoMo|UP.Browser|Vodafone|J-PHONE|PDXGW|ASTEL|EudoraWeb|Minimo|PLink|NetFront|Xiino|";
                // Mobile strings
                BrowserList=BrowserList & "iPhone|Vodafone|J-PHONE|DDIPocket|EudoraWeb|Minimo|PLink|Plucker|NetFront|PIE|Xiino|" &
                "Opera Mini|IEMobile|portalmmm|OpVer|MobileExplorer|Blazer|MobileExplorer|Opera Mobi|BlackBerry\d*[A-Za-z]?|" &
                "PPC|PalmOS|Smartphone|Netscape|Opera|Safari|Firefox|MSIE|HP iPAQ|LGE|MOT-[A-Z0-9\-]*|Nokia|";
    
                // No browser version given
                BrowserList=BrowserList & "AlphaServer|Charon|Fetch|Hv3|IIgs|Mothra|Netmath|OffByOne|pango-text|Avant Browser|midori|Smart Bro|Swiftfox";
    
                // Identify browser and version
    Browser=REMatchNoCase("(#BrowserList#)/?#VerNo#",UserAgent);
    
    if (ArrayLen(Browser) GT 0) {
    
        if (ArrayLen(Browser) GT 1) {
    
            // If multiple browsers detected, delete the common "spoofed" browsers
            if (Browser[1] EQ "MSIE 6.0" AND Browser[2] EQ "MSIE 7.0") ArrayDeleteAt(Browser,1);
            if (Browser[1] EQ "MSIE 7.0" AND Browser[2] EQ "MSIE 6.0") ArrayDeleteAt(Browser,2);
            tmp2=Browser[ArrayLen(Browser)];
    
            for (x=ArrayLen(Browser); x GTE 1; x=x-1) {
                tmp=Rematchnocase("[A-Za-z0-9.]*",Browser[x]);
                if (ListFindNoCase("Navigator,Netscape,Opera,Safari,Firefox,MSIE,PalmOS,PPC",tmp[1]) GT 0) ArrayDeleteAt(Browser,x);
            }
    
            if (ArrayLen(Browser) EQ 0) Browser[1]=tmp2;
        }
    
        // Seperate out browser name and version number
        tmp=Rematchnocase("[A-Za-z0-9. _\-&]*",Browser[1]);
    
        Browser=tmp[1];
    
        if (ArrayLen(tmp) EQ 2) BrowserVer=tmp[2];
    
        // Handle "Version" in browser string
        tmp=REMatchNoCase("Version/?#VerNo#",UserAgent);
    
        if (ArrayLen(tmp) EQ 1) {
            tmp=Rematchnocase("[A-Za-z0-9.]*",tmp[1]);
            BrowserVer=tmp[2];
        }
    
        // Handle multiple BlackBerry browser strings
        if (Left(Browser,10) EQ "BlackBerry") Browser="BlackBerry";
    
        // Return result
        return Browser & " " & BrowserVer;
    
    }
    
    // Unable to identify browser
    return "Unknown";
    
    }
    </cfscript>
    

    【讨论】:

    • 当然,如果新的浏览器出现时没有添加新的字符串,它就会开始失败。
    • 我给了 +1,因为它符合 OP 的意图,但一般来说,我不会依赖它。
    • 我刚刚尝试了上述 7 年的 UDF,它为 Edge 用户代理返回了“Chrome 42”。自 2011 年以来是否有任何更新?结果,我切换到 BrowscapCFC 和缓存查找结果(用于性能),因为 BrowsCap.org 网站保持数据库更新并提供更多信息(平台、爬虫、表格、移动设备等)
    【解决方案4】:

    我创建了由http://browscap.org/ 提供支持的BrowscapCFC。它可能适合您的需求

    【讨论】:

      【解决方案5】:

      ColdFusion 中没有任何内置功能可以让您执行此操作。捕获 user_agent 字符串并手动解析它是您能做的最好的事情。

      第三方应用程序,例如 Browserhawk (http://www.cyscape.com/Default.aspx) 可以做到这一点......虽然我自己没有使用过 Browserhawk,但我明白它做得很好。

      谷歌搜索也出现了http://www.andrewdixon.co.uk/aebrowser/,但那是 6 岁。可能仍然有效......但取决于您需要解决方案的防弹程度,您可能需要考虑像 Browserhawk 这样的东西。您可以在 Google 上搜索用户代理字符串列表并自行处理……但考虑到跨操作系统的浏览器(和版本)数量之多,我认为这本身就是一项全职工作。

      【讨论】:

        【解决方案6】:

        上面的用户定义函数效果很好,但我必须添加以下代码才能使版本号在 IE (MSIE) 中正常工作:

        // Handle MSIE Version issue
        IF (Left(Browser,4) EQ "MSIE") {
                tmpBrowser = Browser;
            IF (listLen("#tmpBrowser#", " ") EQ 2) {
                Browser = listGetAt("#tmpBrowser#", 1, " ");
                BrowserVer = listGetAt("#tmpBrowser#", 2, " ");
            }
        }
        

        使用这样的 user_agent:

        Mozilla/4.0(兼容;MSIE 8.0;Windows NT 6.1;Trident/4.0;SLCC2;.NET CLR 2.0.50727;.NET CLR 3.5.30729;.NET CLR 3.0.30729;Media Center PC 6.0;.NET4 .0C)

        它返回一个空白版本和“MSIE 8.0”的浏览器名称

        【讨论】:

        【解决方案7】:

        这是浏览器名称和版本的最新版本 在 Opra / IE 8 / IE 9 / IE 10 / IE 11 / Edge / Chrome / Firefox 上测试

        <cffunction name="GetBrowser" access="public">
            <cfset var l = {}>
            <cfset l.UserInfo = cgi.HTTP_USER_AGENT>
            <cfset l.Browser = {}>
        
            <cfif FindNoCase ( "Opera", l.UserInfo ) >
                <cfset l.Browser.type = "Opera">
                <cfset l.Browser.Name = "Opera">
            <cfelseif FindNoCase ( "OPR", l.UserInfo )>
                <cfset l.Browser.type = "OPR">
                <cfset l.Browser.Name = "Opera">
            <cfelseif FindNoCase ( "Edge", l.UserInfo )>
                <cfset l.Browser.type = "Edge">
                <cfset l.Browser.Name = "Edge">
            <cfelseif FindNoCase ( "Chrome", l.UserInfo )>
                <cfset l.Browser.type = "Chrome">
                <cfset l.Browser.Name = "Chrome">
            <cfelseif FindNoCase ( "Safari", l.UserInfo )>
                <cfset l.Browser.type = "Safari">
                <cfset l.Browser.Name = "Safari">
            <cfelseif FindNoCase ( "FireFox", l.UserInfo )>
                <cfset l.Browser.type = "FireFox">
                <cfset l.Browser.Name = "FireFox">
            <cfelseif FindNoCase ( "MSIE", l.UserInfo ) >
                <cfset l.Browser.type = "MSIE">
                <cfset l.Browser.Name = "Internet Explorer">
            <cfelseif FindNoCase ( "Trident", l.UserInfo ) >
                <cfset l.Browser.type = "Trident">
                <cfset l.Browser.Name = "Internet Explorer">
            <cfelse>
                <cfset l.Browser.type = "Unknown">
                <cfset l.Browser.Name = "Unknown">
                <cfset l.Browser.Version = "Unknown">
            </cfif>
        
            <cfif FindNoCase ( "rv:" , l.UserInfo ) NEQ 0>
                <cfset l.Params = REFindNoCase ( "rv:[0-9.]+", l.UserInfo, Find ( "rv:", l.UserInfo ), true )>
                <cfset l.FirstOccurrence = l.Params.POS[1]>
                <cfset l.ParamLength = l.Params.LEN[1]>
                <cfset l.BrowserNameLength = Len ( "rv:" )>
                <cfset l.Browser.Version = Mid ( l.UserInfo, ( l.FirstOccurrence + l.BrowserNameLength ), ( l.ParamLength - l.BrowserNameLength ) )>
             <cfelse>
                <cfset l.Params = REFindNoCase ( #l.Browser.type# & "/?[ 0-9.]+", l.UserInfo, Find ( "#l.Browser.type#", l.UserInfo ), true )>
                <cfset l.FirstOccurrence = l.Params.POS[1]>
                <cfset l.ParamLength = l.Params.LEN[1]>
                <cfset l.BrowserNameLength = Len ( l.Browser.type ) + 1>
                <cfset l.Browser.Version = Mid ( l.UserInfo, ( l.FirstOccurrence + l.BrowserNameLength ), ( l.ParamLength - l.BrowserNameLength ) )>
             </cfif>
        
             <cfreturn l.Browser>
        </cffunction>
        
        <cfdump var="#GetBrowser()#">
        

        【讨论】:

          【解决方案8】:

          这里是重构的(从上面)cfscript 版本,仅用于浏览器名称

          function GetBrowserName() {
              var rs = "Unknown";
              var uag = cgi.HTTP_USER_AGENT;
              if (FindNoCase("Opera",uag))
                   rs = "Opera";
              else if (FindNoCase("OPR",uag))
                   rs = "Opera";
              else if (FindNoCase("Edge",uag))
                   rs = "Edge";
              else if (FindNoCase("Chrome",uag))
                   rs = "Chrome";
              else if (FindNoCase("Safari",uag))
                   rs = "Safari";
              else if (FindNoCase("Firefox",uag))
                   rs = "Firefox";
              else if (FindNoCase("MSIE",uag))
                   rs = "IExplore";
              else if (FindNoCase("Trident",uag))
                   rs = "IExplore";
              else
                   rs = "Unknown";
              return rs;
          }
          

          【讨论】:

            猜你喜欢
            • 2016-11-16
            • 2012-09-15
            • 1970-01-01
            • 2022-06-12
            • 2018-09-14
            • 2010-12-27
            • 1970-01-01
            相关资源
            最近更新 更多