【问题标题】:check whether browser is chrome or edge检查浏览器是chrome还是edge
【发布时间】:2026-01-20 10:05:01
【问题描述】:

我当前的网站仅在 Chrome 浏览器中运行,为此我已通过以下方式进行检查

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

但对于Edge,它也只返回"Chrome"

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

【问题讨论】:

  • 使用特征检测代替用户代理嗅探怎么样?顺便说一句,“这个网站只能在 X 浏览器中运行”永远不会受到用户的欢迎。
  • @AlexanderO'Mara 目前处于测试版,我们正在努力使其适用于所有浏览器。但暂时我们要限制它访问其他浏览器
  • 更好的问题是“你在使用什么在 Microsoft Edge 中不起作用?”我们应该解决这个问题,而不是为用户嗅探和破坏网站。

标签: c# .net google-chrome microsoft-edge


【解决方案1】:

您可以检查用户代理并查看它是否是 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

查看更多 herehere

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

【讨论】:

  • 小心,黑名单/白名单用户代理是this whole user agent thing got started
  • 是的。这根本不是一个好主意。恕我直言,特征检测是这里最著名的方法。 @AlexanderO'Mara
  • @AlexanderO'Mara 甚至特征检测也不总是 100%。为什么 Microsoft Edge 在阅读 Request.Browser.Browser 时显示为 Chrome?... 为什么 MozillaAppleWebKit 出现在它的用户代理字符串中?
【解决方案2】:

我很好奇——用例是什么?无论如何,给你:

Microsoft Edge UA 字符串:

Mozilla/5.0 (Windows NT 10.0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/42.0.2311.135 Safari/537.36 Edge/12.10136

I detail why in this blog post.

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

您还会注意到整个字符串以“Edge/12.0”结尾,而 Chrome 没有。

我应该指出,这与微软在 IE 11 上所做的做法并没有完全不同,在 Windows 8 上显示为:Mozilla/5.0 (Windows NT 6.3; Trident/7.0; rv:11.0) like Gecko,as在这篇文章中解释。

什么是用户代理嗅探?

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

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

Here’s a great article explaining the history of the User Agent.

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

The Edge team details this even deeper on their blog.

所有用户代理字符串都包含有关其他浏览器的信息,而不是您正在使用的实际浏览器——不仅是标记,还有“有意义的”版本号。

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, like Gecko) Chrome/42.0.2311.135 Safari/537.36 Edge/12.10136

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

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

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

结论

通过提供 Chrome UA 字符串,我们可以解决这些开发人员正在使用的技巧,从而为用户提供最佳体验。

【讨论】:

  • 一个用例...向用户报告他们在上周登录时使用的是 Chrome 还是 Edge。 (与特征检测无关......只是告诉人们他们需要知道的内容。)
【解决方案3】:
if(HttpContext.Current.Request.UserAgent.Contains("Edge"))
{
   // Allow
}

为我工作。

【讨论】:

    【解决方案4】:

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

    最初来自this question我使用了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; }
    }
    

    【讨论】: