如果客户端支持SPDY,我如何检测服务器端?
我希望我的网站尽可能快。这是我的想法:(注意:我的网站不需要传输敏感数据。)如果浏览器使用HTTPS连接到我的网站,但它不支持SPDY,那将是一种浪费。由于HTTPS的不必要的开销吗?另一方面,如果浏览器通过HTTP连接并支持SPDY,那将是错失的机会。
看起来NPN是客户端和服务器用于在SPDY上协商的技术。这种情况发生在Web服务器上,在它发出我的应用程序代码之前,对吗?我想那时我真正需要的是NPN的修改版本(甚至不确定它是否真的是SPDY以外的东西)或mod_spdy。理想情况下,这样的版本会有一个名为use_spdy_if_available_otherwise_redirect_to_http
的选项。 : - )
哦,如果这一切都不够复杂,我现在正在使用Cloudflare的CDN服务。我很确定我无法改变他们在这方面的运作方式,因此没有机会,对吗?
答案 0 :(得分:2)
所有数据都是敏感的:您访问的网站,您浏览过的网页等。通过在多个网页上汇总这些数据,您可以推断出很多关于用户的信息:他们的意图,兴趣等等。因此,我们需要无处不在的HTTPS。有关更多信息,请参阅有关此主题的Google I / O演讲[1]。
在检测SPDY支持方面,是的,你想使用NPN / ALPN(ALPN是继承者[2])。客户端在握手中发送ProtocolNameList
,通告它们支持的协议。大多数服务器将使用它来自动协商SPDY,但如果您想自己控制此决策,则必须修改服务器实现以在执行安全握手时调用某种回调。
那就是说,鉴于我之前所说的无处不在的HTTPS,我会建议你完全反对这一点。在任何地方使用HTTPS,如果支持SPDY,则让浏览器和服务器自动协商SPDY。
答案 1 :(得分: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;
}