HTTP2标头与旧版浏览器的兼容性

时间:2015-02-26 11:07:04

标签: php header compatibility http-1.1

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


旧浏览器如何响应http2标头?

我的意思是在php(http://php.net)上仍然存在(26.02.2015)标题函数(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的标题。但旧版浏览器将如何应对呢?这对于web开发人员和php编码器是否透明,并在浏览器/服务器端实现,或者有一些关于兼容性的重要事项/线索?

他们准备好后立即使用http2标头了吗?

我不想伤害任何人,但是我知道这样一个浏览器,它的名字首先出现在I上,第二个用字母E,这总是会让人感到困惑。我担心新规范会完全毁掉这个浏览器的所有旧版本,而且这个http2。而且我们 - 开发人员必须编写可以正常运行的网站,无论在哪里,只要数百万次补丁/升级/数月与旧机器的兼容性问题,魔术http2就会实现。


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

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

在这种情况下,旧浏览器怎么样?

在http2活着之后立即使用它是个好主意吗?


其他文件:

  1. 草案http2规范: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

1 个答案:

答案 0 :(得分: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(例如,我们说的可能是通过其他协议进行服务广告的内部网环境),HTTP / 2客户端会打开与“PRI * HTTP / 2.0 \ r \ n \ r \ nSM \ r \ n \ r \ n”的连接,并立即被 HTTP / 1.1 400错误请求拒绝任何HTTP / 1.X服务器。 (例如,客户端可能会将请求降级到HTTP / 1.1并继续。)

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

不再发送状态代码和消息以及协议版本。而是使用伪标头 - 基本上只是带有:前面的标头,以确保不与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连接的头,具体取决于客户端 - 但它需要重写软件,除非他们决定header()重新解析每个参数对于HTTP / 2输出(这是不可想象的,但在我看来它会导致比它解决的问题更多的问题)。

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

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

我期待看到我们能做些什么!