Jac*_*ski 4 php compatibility header 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?
?>
Run Code Online (Sandbox Code Playgroud)
在这种情况下,旧浏览器呢?
在http2活着之后立即使用它是一个好主意吗?
附加文件:
小智 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>
Run Code Online (Sandbox Code Playgroud)
资料来源:HTTP/2草案17,第3.2节
我直接在那里引用规范,所以来自真实客户端的真实请求看起来会稍微复杂一点 - 它还包括通常的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
Run Code Online (Sandbox Code Playgroud)
资料来源: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 \n \n \n"的连接,并立即被任何HTTP/1.X服务器拒绝HTTP/1.1 400错误请求.(例如,客户端可能会将请求降级到HTTP/1.1并继续.)
重写PHP应用程序以直接使用HTTP/2将比更改header('HTTP/X.X...')数字花费更多的工作. Saikyr是对的,HTTP/2是二进制协议; 这意味着我们将使用新的库直接从PHP编写HTTP/2.
不再发送状态代码和消息以及协议版本.相反,使用伪标头 - 基本上只是带有:前面的标头,以确保不与HTTP/1.X标头冲突.但是,标题不会以明文形式发送 - 已经制定了一个压缩方案,用于将标题转换为二进制代码. HPACK草案12.(我没有读过它;它不像HTTP/2那样翻页.)
所以header("HTTP/2 404 Not Found");你不会做这样的事情:
\HTTP2::setHeader(':status','404');
Run Code Online (Sandbox Code Playgroud)
或者代替 header("Location: $PROTO://$HOST$PATH");
\HTTP2::setHeader('location', "$PROTO://$HOST$PATH");
Run Code Online (Sandbox Code Playgroud)
我还没有意识到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环境都能够提供样式表,脚本和图像列表,而无需重新解析客户端的输出.
我很期待看到我们能做些什么!
| 归档时间: |
|
| 查看次数: |
3528 次 |
| 最近记录: |