已经有一个关于使用客户端检测 WebP 支持的线程。如何使用服务器端检测 WebP 支持?
4 回答
今天,您应该检查accept
标题中的image/webp
. 所有支持 WebP 的浏览器都会将此作为其接受字符串的一部分发送给所有请求(图像和非图像)。简而言之:
if( strpos( $_SERVER['HTTP_ACCEPT'], 'image/webp' ) !== false ) {
// webp is supported!
}
(您可能想preg_match
改用并添加单词边界检查和不区分大小写,但在现实世界中这应该没问题)
这是我几年前的原始答案,当时上述内容不可靠
“正确”的方法是检查accept
发送的标头,但 Chrome 中的一个错误意味着image/webp
即使它支持它也不会列出。
这是一个相关的论坛主题:https ://groups.google.com/a/webmproject.org/forum/#!topic/webp-discuss/6nYUpcSAORs
链接到这个 bugtracker:https ://code.google.com/p/chromium/issues/detail?id=169182又链接到这个:https ://code.google.com/p/chromium/issues /detail?id=267212
最终结果?虽然它还没有实现,但很快谷歌浏览器将明确列出图像和非图像请求image/webp
的可接受类型。因此,您提供 HTML 的脚本可以检查这一点。Opera 已经将其作为其标准标头的一部分发送(同样无论它是否是图像请求)。image/webp
accept
所以,你可以像这样检查:
if( strpos( $_SERVER['HTTP_ACCEPT'], 'image/webp' ) !== false || strpos( $_SERVER['HTTP_USER_AGENT'], ' Chrome/' ) !== false ) {
// webp is supported!
}
(您可能想preg_match
改用并添加字边界检查和不区分大小写,但在现实世界中这应该没问题。您可能还想检查至少版本 6 的 Chrome,但几乎没有人跑出来-date 版本,所以没什么意义)
戴夫的回答很好,但不适用于所有浏览器。我使用这种方法:
function GetBrowserAgentName($user_agent) {
if (strpos($user_agent, 'Opera') || strpos($user_agent, 'OPR/')) return 'Opera';
elseif (strpos($user_agent, 'Edge')) return 'Edge';
elseif (strpos($user_agent, 'Chrome')) return 'Chrome';
elseif (strpos($user_agent, 'Safari')) return 'Safari';
elseif (strpos($user_agent, 'Firefox')) return 'Firefox';
elseif (strpos($user_agent, 'MSIE') || strpos($user_agent, 'Trident/7')) return 'Internet Explorer';
return 'Other';
}
所以检查浏览器后:
$BrowserAgentName = GetBrowserAgentName($_SERVER['HTTP_USER_AGENT']);
If ($BrowserAgentName == 'Chrome' || $BrowserAgentName =='Opera') {
// webp is supported!
}
这里我只添加了 Opera 和 Chrome,您可以使用更深的浏览器版本检测器并为您的 if{} 添加更多代理。但是您需要在浏览器更新以支持图像/webp 时更新此代码。
就我而言,我使用的是 C# Asp.Net MVC。SO 没有指定技术,所以我发现自己在看这个线程。对于碰巧遇到这种情况的其他人来说,这是我想出的解决方案:
bool acceptsWebP = Request.AcceptTypes.Contains("image/webp");
string ext = Path.GetExtension(image.ImagePath);
string webP = image.ImagePath.Replace(ext, ".webp");
if (acceptsWebP)
{
<img class="img-fluid lazy" src="data:image/gif;base64,R0lGODlhAQABAIAAAP///wAAACH5BAEAAAAALAAAAAABAAEAAAICRAEAOw==" data-src="\Uploads\@webP" alt="@item.ProductName">
}
else
{
<img class="img-fluid lazy" src="data:image/gif;base64,R0lGODlhAQABAIAAAP///wAAACH5BAEAAAAALAAAAAABAAEAAAICRAEAOw==" data-src="\Uploads\@image.ImagePath" alt="@item.ProductName">
}
只是我在 Facebook 上注意到的一件小事——他们的 facebookexternalhit 机器人(当有人向其发布地址时抓取您的网站的机器人)还不能识别 webp 图像。因此,我添加了以下检查以禁用我客户网站中的 webp 图像以供 Facebook 机器人使用:
if (strstr(strtolower($_SERVER["HTTP_USER_AGENT"]), "facebook"))
return false;
否则,当一个网页被分享时,它会显示错误的图像(它会在页面中找到的第一个 JPG)。