0

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

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

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

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

4

2 回答 2

2

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

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

也就是说,鉴于我之前所说的无处不在的 HTTPS,我建议您完全反对这种做法。在任何地方使用 HTTPS 并让浏览器和服务器自动协商 SPDY(如果支持)。

于 2014-08-20T18:40:13.727 回答
0

我同意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;
}
于 2014-11-30T09:14:07.877 回答