我今天听说很快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活着之后立即使用它是个好主意吗?
其他文件:
答案 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 / 1.1标头,这样服务器就不希望升级到HTTP / 2可以简单地继续请求。不支持HTTP / 2的服务器只会忽略Upgrade: h2c
和HTTP2-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环境都能够提供样式表,脚本和图像列表,而无需重新解析客户端的输出。
我期待看到我们能做些什么!