在我的项目中,我有一些硬编码的HTTP状态代码和描述,例如:
$this->output->set_header("HTTP/1.1 422 Unprocessable entity");
我不清楚Section 8.1.3 of HTTP/2 specs因为它看起来像HTTP / 2服务器不再返回完整的标题行(协议,状态代码和状态描述)。例如:
HTTP/1.1 200 OK
Content-Type: image/jpeg
Content-Length: 123
会变成:
HEADERS
+ END_STREAM
+ END_HEADERS
:status = 200
content-type = image/jpeg
content-length = 123
使用我的demo时,浏览器看起来不会受到以“HTTP / 1.1”开头的响应的困扰。
所以我想知道是否迫切需要依赖框架来返回正确的状态代码(框架构建一个以$ _SERVER ['SERVER_PROTOCOL']开头的字符串)。请参阅此SO question以了解实施情况。或者如果没关系。
答案 0 :(得分:1)
正如您所说,HTTP / 2协议中没有文本状态行,可用于传输包含" HTTP / 1.1"的字符串。 HTTP / 2仅在伪头值:status
中以数字形式传输状态代码,该值将由客户端获取。
所以主要的问题是当你打电话时你选择的框架在做什么
$this->output->set_header("HTTP/1.1 422 Unprocessable entity");
如果框架在HTTP / 2情况下解析这一行,只提取422
并将其放在:status
伪头中,那么一切都很好。如果它不解析它,那么我不知道它将如何设置状态代码。您的框架/网络服务器也不能将此字符串用作普通标头 - 因为您在此处设置的只是一个字符串值。设置普通标头将需要标头的名称和值。所以我猜你的框架只是删除了无关的数据,一切都很好。
如果您感兴趣,可以使用nghttp2
命令行工具nghttp
来调试连接。拨打nghttp -v https://your-host
之类的电话,它会调试打印所有收到的标头值,包括伪标题。