2015-02-26 123 views
4

今天我听说很快就会在现代浏览器中实现http2协议。更多信息:https://en.wikipedia.org/wiki/HTTP/2,我知道维基百科不是最好的资源,但它会给出一些关于正在发生的事情的线索。问题是:HTTP2头与旧版浏览器的兼容性


旧浏览器如何响应http2头?

我的意思是在PHP(http://php.net)仍有(2015年2月26日)一在头函数(http://php.net/manual/en/function.header.php)链接到http1.1规范(http://www.faqs.org/rfcs/rfc2616)。据我所知,在http2我所要做的就是将标题从HTTP/1.1 404 Not Found更改为类似于HTTP/2.0 404 Not Found的东西。但是旧版浏览器会如何回应?这对webdeveloper和php编码器是透明的,并且在浏览器/服务器端实现,或者有一些关于兼容性的重要事情/线索?

正确使用http2头后,他们准备好了吗?

我不想伤害任何人,但我知道这样,它名字的福斯产品I启动浏览器,和第二字母E,可总是乱了一点。恐怕新的规范将彻底毁掉这个浏览器的所有旧版本,并且这个http2。而且,我们 - 开发人员必须编写正常工作的网站,无论在哪里,并且在老式机器数以千万计的补丁/升级/几个月的兼容性问题后,神奇的http2将会实现。


必须有很好的问题形成了一些代码,所以这里是:):

<?php 
    header("HTTP/2.0 404 Not Found"); // Am I correct? It will look like this? 
?> 

什么旧的浏览器在这种情况下?

这是一个好主意,在http2活着之后使用它吧?


附加文档:http2

  1. 草案规范:https://tools.ietf.org/html/draft-ietf-httpbis-http2-17
  2. 维基百科几句:https://en.wikipedia.org/wiki/HTTP/2
  3. PHP头功能:http://php.net/manual/en/function.header.php
  4. W3.org约http2:http://www.w3.org/Protocols/HTTP/HTTP2.html
+0

PS。我的问题的第二部分是基于一点点意见,但我希望有一个答案,这就是我问它的原因。我的意思是,如果有很大的优点或缺点,请写出来,如果这取决于,第二部分并不重要。我不想在这里进行讨论,但请检查http2官方批准后是否可以正确使用。 –

+1

http2.0是基于二进制的,怀疑它会和以前一样 – Carey

回答

10

在典型的情况下,支持HTTP/2的客户端联系服务器时首先使用HTTP/1.1连接,使用Upgrade:标头指示HTTP/2支持的可用性。

这看起来是这样的:

GET/HTTP/1.1 
Host: server.example.com 
Connection: Upgrade, HTTP2-Settings 
Upgrade: h2c 
HTTP2-Settings: <base64url encoding of HTTP/2 SETTINGS payload> 

来源:HTTP/2 draft 17, Sec 3.2

我引用的规格,直接出现,所以从真正的客户真正的要求会稍微复杂一点的期待 - 这将包括通常的HTTP/1.1头也是如此,以至于不希望升级到HTTP/2的服务器可以简单地继续这个请求。不支持HTTP/2的服务器只会忽略Upgrade: h2cHTTP2-Settings: ...标头。

服务器升级连接到HTTP与/ 2响应:

HTTP/1.1 101 Switching Protocols 
Connection: Upgrade 
Upgrade: h2c 
  
PRI * HTTP/2.0 
  
SM 
  
  

来源:HTTP/2草案17,二段3.2

也就是说部开始PRI *被称为 '客户端连接前言' 和是在任何HTTP/2连接开始时发送。它被设计成一个没有HTTP/1.0或/1.1服务器响应的字符串。这意味着,即使在浏览器有理由相信服务器在连接前支持HTTP/2的非典型场景(例如,我们正在讨论可能是通过其他协议进行服务广告的Intranet环境)时,HTTP/2客户端将打开与“PRI * HTTP/2.0 \ r \ n \ r \ nSM \ r \ n \ r \ n”的连接,并立即被任何HTTP/1以HTTP/1.1 400错误请求拒绝。 X服务器。 (例如,客户端可能会将请求降级到HTTP/1.1并继续,例如)。

重写PHP应用程序以直接使用HTTP/2比改变header('HTTP/X.X...')号码要花费更多的工作量。 Saikyr是对的,HTTP/2是二进制协议;这意味着我们将使用一个新的库直接从PHP编写HTTP/2。

发送状态码和消息以及协议版本不再发生。相反,使用伪头文件 - 基本上只是在前面加上a:的头部以确保不与HTTP/1.X头部发生冲突。然而,头文件不会以明文方式发送 - 已经制定了将头文件转换为二进制代码的压缩方案。 HPACK draft 12.(我还没有看过,这是少了翻页式比HTTP/2)。

所以不是header("HTTP/2 404 Not Found");你会做这样的事情:

\HTTP2::setHeader(':status','404'); 

或代替header("Location: $PROTO://$HOST$PATH");

\HTTP2::setHeader('location', "$PROTO://$HOST$PATH"); 

我还没有意识到这种支持在PHP中,所以我猜那里有一点。我不确定PHP是否可以获得足够的Apache连接控制权来从HTTP/2升级并管理连接本身。随着向Apache添加支持,PHP可能有机会在图书馆级别进行链接。无论新的库如何,它可能仍然能够编写HTTP/1.1连接的头文件,具体取决于客户端 - 但它需要重写软件,除非他们决定重新解析每个HTTP/2参数输出(这不是不可思议的,但在我看来,它会导致比解决更多的问题)。

可以添加HTTP/2支持的一种方法是在服务器/传输级别,并将HTTP/1.1标头翻译成HTTP/2。Apache模块可以设想解析HTML输出并检测链接的样式表,脚本和图像,并在响应GET请求时向客户端生成PUSH_PROMISE。

直接在PHP中支持HTTP/2的主要优点是可以将链接的资源“推送”给支持该功能的愿意客户端。许多基于PHP的CMS环境将能够提供样式表,脚本和图像列表,而不必重新解析用于客户端的输出。

我期待着看到我们能做的事!附件1:

+0

我现在接受你的回答。我很确定没有人会发布更好的答案:)。另外从我+1。感谢您的时间,以及丰富的资源。我完全印象深刻。我保证我会按照你的个人资料和+1每个“如此专业”的答案:)。 –

+1

谢谢!我一直在享受阅读规范,所以我很乐意分享我的想法。你的问题真的很合时宜。 –