检查浏览器是 chrome 还是 edge
check whether browser is chrome or edge
我当前的网站只能在 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, like Gecko) Chrome/42.0.2311.135 Safari/537.36 Edge/12.10136
I detail why in this blog post.
Neowin 最近报道说,微软的 Windows10 新浏览器 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) 就像 Gecko 一样,如 post.
中所述
什么是用户代理嗅探?
通常,Web 开发人员会通过 UA 嗅探来检测浏览器。 Mozilla 在他们的博客上对此进行了很好的解释:
为不同的浏览器提供不同的网页或服务通常不是一个好主意。 Web 旨在让每个人都可以访问,无论他们使用的是哪种浏览器或设备。有多种方法可以开发您的网站,以根据功能的可用性逐步增强自身,而不是针对特定浏览器。
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 嗅探代码失败,同时仍然试图传达一些实际有用和准确的信息。”)
我们建议网络开发人员尽可能避免 UA 嗅探;现代网络平台的功能几乎都可以通过简单的方式检测到。在过去的一年里,我们看到一些 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 所以现在我另外使用这个包装器 class:
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; }
}
我当前的网站只能在 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, like Gecko) Chrome/42.0.2311.135 Safari/537.36 Edge/12.10136
I detail why in this blog post.
Neowin 最近报道说,微软的 Windows10 新浏览器 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) 就像 Gecko 一样,如 post.
中所述什么是用户代理嗅探?
通常,Web 开发人员会通过 UA 嗅探来检测浏览器。 Mozilla 在他们的博客上对此进行了很好的解释:
为不同的浏览器提供不同的网页或服务通常不是一个好主意。 Web 旨在让每个人都可以访问,无论他们使用的是哪种浏览器或设备。有多种方法可以开发您的网站,以根据功能的可用性逐步增强自身,而不是针对特定浏览器。
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 嗅探代码失败,同时仍然试图传达一些实际有用和准确的信息。”)
我们建议网络开发人员尽可能避免 UA 嗅探;现代网络平台的功能几乎都可以通过简单的方式检测到。在过去的一年里,我们看到一些 UA 嗅探网站已经更新以检测 Microsoft Edge……只是为了为其提供旧的 IE11 代码路径。这不是最好的方法,因为 Microsoft Edge 匹配“WebKit”行为,而不是 IE11 行为(任何 Edge-WebKit 差异都是我们有兴趣修复的错误)。
根据我们的经验,Microsoft Edge 在这些站点的“WebKit”代码路径上运行得最好。此外,随着互联网在越来越多的设备上可用,请假设未知浏览器是好的——请不要将您的站点限制为只能在一小部分当前已知的浏览器上运行。如果这样做,您的网站将来几乎肯定会崩溃。
结论
通过提供 Chrome UA 字符串,我们可以解决这些开发人员正在使用的黑客攻击,为用户提供最佳体验。
if(HttpContext.Current.Request.UserAgent.Contains("Edge"))
{
// Allow
}
对我有用。
我在记录 JavaScript 错误时使用浏览器检测,因为它有助于了解错误发生在哪个浏览器中。
最初来自
<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 所以现在我另外使用这个包装器 class:
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; }
}