如果客户端支持 SPDY,我如何检测服务器端?

Posted

技术标签:

【中文标题】如果客户端支持 SPDY,我如何检测服务器端?【英文标题】:How can I detect, server side, if the client supports SPDY? 【发布时间】:2014-10-13 04:50:38 【问题描述】:

我希望我的网站尽可能快。这是我的想法:(注意:我的网站不需要传输敏感数据。)如果浏览器使用 HTTPS 连接到我的网站但它不支持 SPDY ,那将是一种浪费。 HTTPS 导致不必要的开销,对吗?另一方面,如果浏览器通过 HTTP 连接并且确实支持 SPDY,那将是一个错失的机会。

看起来 NPN 是客户端和服务器用来协商 SPDY 与否的技术。这发生在 Web 服务器中,在它到达我的应用程序代码之前,对吧?我想我真正需要的是 NPN 的修改版本(甚至不确定这是否真的是它自己在 SPDY 之外的东西)或 mod_spdy。理想情况下,这样的版本会有一个名为use_spdy_if_available_otherwise_redirect_to_http 的选项。 :-)

哦,如果这一切还不够复杂,我目前正在使用 Cloudflare 的 CDN 服务。我很确定我没有办法修改他们在这方面的运作方式,因此没有机会,对吧?

【问题讨论】:

【参考方案1】:

我同意igrigorik 的建议:不要将用户从HTTPS 重定向到HTTP。这不酷。无论如何,我今天遇到了这个检测问题,我的答案如下。

nginx(我运行的是 1.7.7)中,如果客户端使用 SPDY 连接,将设置 $spdy 变量。否则,$spdy 将没有值。例如,我将自定义 URL 参数传递给 php 脚本:

server 
  listen 443 ssl spdy;
  ...
  ...

  # add SPDY rewrite param
  if ($spdy) 
    rewrite ^/detect-spdy.js /detect-spdy.js.php?spdy=$spdy last;
  
  # fallback to non-SPDY rewrite
  rewrite ^/detect-spdy.js /detect-spdy.js.php last;

  # add response header if needed later 
  add_header x-spdy $spdy;

【讨论】:

【参考方案2】:

所有数据都是敏感数据:您访问的网站、浏览过的页面等。通过在许多页面中汇总这些数据,您可以推断出很多关于用户的信息:他们的意图、兴趣等等。因此,我们到处都需要 HTTPS。有关更多信息,请参阅我们关于该主题的 Google I/O 演讲 [1]。

在检测 SPDY 支持方面,是的,您想使用 NPN/ALPN(ALPN 是继任者 [2])。客户端在他们的握手中发送一个ProtocolNameList,通告他们支持哪些协议。大多数服务器将使用它来自动协商 SPDY,但如果您想自己控制此决定,则必须修改服务器实现以在执行安全握手时调用某种回调。

也就是说,鉴于我之前所说的无处不在的 HTTPS,我建议您完全不要这样做。到处使用 HTTPS,让浏览器和服务器自动协商 SPDY(如果支持)。

[1]https://www.youtube.com/watch?v=cBhZ6S0PFCY [2]http://chimera.labs.oreilly.com/books/1230000000545/ch04.html#ALPN

【讨论】:

以上是关于如果客户端支持 SPDY,我如何检测服务器端?的主要内容,如果未能解决你的问题,请参考以下文章

如何检测服务器是不是正在使用 SPDY

为了支持 Chrome 的 SPDY,我们需要在服务器端做些啥吗?

如何告诉服务器客户端支持 SPDY 协议?

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

如何理解 TCP/IP,SPDY,WebSocket 三者之间的关系

如果服务器实现 spdy/3 而浏览器只支持 spdy/2 会发生啥?