检测浏览器是否支持 WebP 格式?(服务器端)

2022-08-30 15:07:37

已经有一个关于使用客户端检测 WebP 支持的线程。如何使用服务器端检测 WebP 支持?


答案 1

今天,您应该检查 标题中的 .所有支持 WebP 的浏览器都会将其作为其所有请求(图像和非图像)的接受字符串的一部分发送。总之:acceptimage/webp

if( strpos( $_SERVER['HTTP_ACCEPT'], 'image/webp' ) !== false ) {
    // webp is supported!
}

(您可能希望使用并添加单词边界检查和不区分大小写,但在现实世界中这应该没问题)preg_match


这是我几年前的原始答案,当时上述内容并不可靠。

“正确”的方法是检查发送的标头,但是Chrome中的错误意味着即使它确实支持它,它也不会列出。acceptimage/webp

这是一个相关的论坛帖子:https://groups.google.com/a/webmproject.org/forum/#!topic/webp-discuss/6nYUpcSAORs

哪个链接到这个错误跟踪器:https://code.google.com/p/chromium/issues/detail?id=169182 又链接到这个:https://code.google.com/p/chromium/issues/detail?id=267212

最终结果如何?虽然它尚未实现,但很快Google Chrome将明确列为图像和非图像请求的可接受类型。因此,提供HTML的脚本可以对此进行检查。Opera已经作为其标准标头的一部分发送(同样,无论它是否是图像请求)。image/webpimage/webpaccept

因此,您可以像这样检查:

if( strpos( $_SERVER['HTTP_ACCEPT'], 'image/webp' ) !== false || strpos( $_SERVER['HTTP_USER_AGENT'], ' Chrome/' ) !== false ) {
    // webp is supported!
}

(您可能希望使用并添加单词边界检查和不区分大小写,但在现实世界中,这应该没问题。您可能还想检查Chrome的至少版本6,但是几乎没有人运行过时的版本,因此没有多大意义)preg_match


答案 2

Dave的答案很好,但不适用于所有浏览器。我使用这种方法:

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 时,您需要更新此代码。


推荐