在浏览器中检测HTTP2 / SPDY支持

时间:2014-11-30 07:40:55

标签: nginx http2 spdy

是否可以在浏览器中检测浏览器对HTTP2 / SPDY客户端的支持?

我试图向用户显示他们的浏览器是否支持HTTP2 / SPDY,还是使用传统的非HTTP2 / SPDY HTTP协议。

2 个答案:

答案 0 :(得分:2)

不,不是真的。至少以一种有意义或可行的方式。

在服务器已经提供了所有资产之后,前端javascript将会运行。您想要做的一切都将在服务器端完成。符合SPDY标准的浏览器应自动与SPDY服务器协商。

您需要做的就是将其配置为执行此操作(nginxapache)。您还可以使用https回复发送Alternate-Protocol标头。如果可能的话,这将使浏览器在将来响应SPDY请求(我无法在更新的SPDY规范中找到它,因此可能是过时的信息。请加盐)。

如果你想知道一个网站是否已经使用SPDY服务,那么在chrome中有chrome.loadTimes()。wasFetchedViaSpdy(显然只适用于chrome)。对于firefox和safari你必须检查标题(据我所知,没有类似的api,虽然plugins存在为你做这个)。 SPDYCheck是测试服务器是否已正确设置的另一个重要资源。

答案 1 :(得分:2)

帕特,谢谢。我接受了你的建议并利用了nginx的$http2变量,并使用PHP返回一个动态JS变量用于浏览器的检测。 (如果其他读者喜欢,也可以选择传递cookie或为AJAX检测添加响应头。)

NGINX配置添加

server {
    ...

    if ($http2) { 
        rewrite ^/detect-http2.js /detect-http2.js.php?http2=$http2 last;
    }
    # fallback to non-HTTP2 rewrite
    rewrite ^/detect-http2.js /detect-http2.js.php last;

    # add response header if needed in the future
    add_header x-http2 $http2;
}

<强>检测-http2.js.php

<?
    header('content-type: application/javascript');
    if (isset($_REQUEST['http2'])) {
        echo "var h2Version='". $_REQUEST['http2'] . "';\n";
    }
?>

<强>检测-http2.html

<html>
    <body>
        <script src="https://DOMAIN_NAME/detect-http2.js"></script>
        <script>
            document.write('HTTP2-Supported Browser: '+ (typeof h2Version !== 'undefined'));
        </script>
    </body>
</html>