如果客户端支持 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,我如何检测服务器端?的主要内容,如果未能解决你的问题,请参考以下文章
为了支持 Chrome 的 SPDY,我们需要在服务器端做些啥吗?