检查浏览器是镀铬还是边缘

本文关键字:边缘 浏览器 检查 | 更新日期: 2023-09-27 18:07:00

我当前的网站只在Chrome浏览器中运行,为此我检查了以下方式

if (Request.Browser.Browser == "Chrome")
{
   // Allow
}

但对于Edge来说,它也只是以"Chrome"的形式返回。

如何允许仅从Chrome浏览器访问?

检查浏览器是镀铬还是边缘

您可以检查用户代理并查看它是否是Microsoft Edge,因为Microsoft Edge的用户代理字符串中包含Edge/version

//get user agent somehow here based on what you are working on
userAgent = Request.UserAgent;
if (userAgent.IndexOf("Edge") > -1)
{
   // maybe client's browser is Microsoft Edge
}

Edge用户代理字符串的示例

Mozilla/5.0 (X11; CrOS x86_64 6783.1.0) AppleWebKit/537.36 (KHTML, like Gecko) Edge/12.0

点击此处查看更多

最后,我建议在浏览器上使用特征检测,而不是基于用户代理。

我很好奇——用例是什么?不管怎样,给你:

Microsoft Edge UA字符串:

Mozilla/5.0(Windows NT 10.0(AppleWebKit/537.36(KHTML,类似Gecko(Chrome/42.2311.35 Safari/537.36 Edge/12.136

我在这篇博客文章中详细说明了原因。

Neowin最近报道称,微软针对Windows 10的新浏览器Spartan使用Chrome UA字符串,"Mozilla/5.0(Windows NT 10.0;WOW64(AppleWebKit/537.36(KHTML,类似Gecko(Chrome/39.0271.71 Safari/537.36 Edge/12.0"。这是故意的。

你还会注意到整个字符串以"Edge/12.0"结尾,而Chrome没有

我应该指出的是,这并不是微软对IE 11的彻底背离,正如本文所解释的,IE 11在Windows 8上的版本是:Mozilla/5.0(Windows NT 6.3;三叉戟/7.0;rv:11.0(,就像Gecko一样。

什么是用户代理嗅探

通常,web开发人员会通过UA嗅探来检测浏览器。Mozilla在他们的博客上很好地解释了这一点:

为不同的浏览器提供不同的网页或服务通常是个坏主意。网络意味着每个人都可以访问,无论他们使用的是哪种浏览器或设备。有一些方法可以开发你的网站,根据功能的可用性而不是针对特定的浏览器来逐步增强自己。

这是一篇很好的文章,介绍了用户代理的历史。

通常,懒惰的开发人员只会嗅探UA字符串,并根据他们认为观众正在使用的浏览器禁用网站上的内容。对于开发人员来说,InternetExplorer8是一个常见的挫折点,因此他们会经常检查用户是否使用任何版本的IE,并禁用功能。

Edge团队在他们的博客上更详细地描述了这一点。

所有用户代理字符串包含的关于其他浏览器的信息比您正在使用的实际浏览器更多——不仅是令牌,还有"有意义的"版本号。

Internet Explorer 11的UA字符串:

Mozilla/5.0(Windows NT 6.3;Trident/7.0;rv:11.0(类似Gecko

Microsoft Edge UA字符串:

Mozilla/5.0(Windows NT 10.0(AppleWebKit/537.36(KHTML,类似Gecko(Chrome/42.2311.35 Safari/537.36 Edge/12.136

在W3C的讨论中,Patrick H.Lauke恰当地将userAgent属性描述为"一堆不断增长的谎言"。("或者更确切地说,是一种平衡行为,添加足够多的遗留关键字,不会立即让旧的UA嗅探代码崩溃,同时仍然试图传达一点实际有用和准确的信息。"(

我们建议web开发人员尽可能避免UA嗅探;现代web平台的功能几乎都可以通过简单的方式检测到。在过去的一年里,我们看到一些UA嗅探网站已经更新,以检测Microsoft Edge……只是为其提供了一个遗留的IE11代码路径。这不是最好的方法,因为Microsoft Edge匹配"WebKit"行为,而不是IE11行为(Edge WebKit的任何差异都是我们感兴趣修复的错误(。

根据我们的经验,Microsoft Edge在这些网站的"WebKit"代码路径上运行得最好。此外,随着互联网在越来越多的设备上可用,请假设未知浏览器是好的——请不要将您的网站限制为仅在一小部分当前已知的浏览器上工作。如果你这样做,你的网站几乎肯定会在未来崩溃。

结论

通过提供Chrome UA字符串,我们可以绕过这些开发人员正在使用的黑客,向用户提供最佳体验。

if(HttpContext.Current.Request.UserAgent.Contains("Edge"))
{
   // Allow
}

为我工作。

我在记录JavaScript错误时使用浏览器检测,因为知道错误发生在哪个浏览器中很有用。

最初,我在App_Browsers文件夹中使用了一个条目:

<browser id="Edge" parentID="Chrome">
  <identification>
    <userAgent match="Edge/(?'version'(?'major''d+)(?'minor''.'d+))" />
  </identification>
  <capabilities>
    <capability name="browser" value="Edge" />
    <capability name="version" value="${version}" />
    <capability name="majorversion" value="${major}" />
    <capability name="minorversion" value="${minor}" />
  </capabilities>
</browser>

但这是不一致的,有时仍然报告Chrome,所以现在我额外使用了这个包装类:

using System.Web;
public class BrowserInfo
{
    public BrowserInfo(HttpRequestBase request)
    {
        if (request.Browser != null)
        {
            if (request.UserAgent.Contains("Edge")
                && request.Browser.Browser != "Edge")
            {
                Name = "Edge";
            }
            else
            {
                Name = request.Browser.Browser;
                Version = request.Browser.MajorVersion.ToString();
            }
            Browser = request.Browser;
            Platform = request.Browser.Platform;
            IsMobileDevice = request.Browser.IsMobileDevice;
            if (IsMobileDevice)
            {
                Name = request.Browser.Browser;
                Name = request.Browser.Browser;
            }
        }
    }
    public HttpBrowserCapabilitiesBase Browser { get; }
    public string Name { get; }
    public string Version { get; }
    public string Platform { get; }
    public bool IsMobileDevice { get; }
    public string MobileBrand { get; }
    public string MobileModel { get; }
}