HTTP / 2`:scheme`头的HTTP / 1等效项是什么?

时间:2018-10-25 07:18:04

标签: http2

我正在编写从HTTP / 2到HTTP / 1的代理,反之亦然。

当我收到一个定义为<?php foreach($json['offers'] as $offer) { $image = $offer['picture']; echo "<img src='$image' />"; } ?> 的传入HTTP / 2请求时,对于我的代理HTTP / 1请求,应将其映射到哪个标头?

我能找到的最接近的东西是here

3 个答案:

答案 0 :(得分:1)

将HTTP / 2 :scheme伪标头映射到HTTP / 1.1 X-Forwarded-Proto标头是正确的。

答案 1 :(得分:1)

您基本上不应该映射它。

首先,HTTP没有直接等效于:scheme伪头的信息。该请求是相对路径(例如/path/page/)而不是绝对路径(例如https://www.example.com/path/page/),并且Host标头仅包含服务器名称而不是方案。

因此,连接知道它是HTTP还是HTTPS,并且已暴露给Web服务器等(例如,在Apache的REQUEST_SCHEME变量中),但是在HTTP级别却不知道。

如果充当侦听代理并建立一个HTTP / 2连接,然后将请求转发到另一个,则您应该为第二个连接打开HTTP或HTTPS连接,这取决于下游系统支持的内容。

正如sbordet所指出的,如果您想让下游系统知道原始方案是什么,则可以使用X-Forwarded-Proto标头(技术上已弃用但仍在使用)或Forwarded标头,但这是更多信息仅供参考,而不是直接映射原始请求中的内容。该方案与 current 请求有关。

答案 2 :(得分:0)

根据RFC 7540, section 8.1.2

  

虽然HTTP / 1.x使用消息开始行(请参见[RFC7230],      3.1节)传达目标URI,请求的方法以及      响应的状态码,HTTP / 2使用特殊的伪头      为此,以':'字符(ASCII 0x3a)开头的字段。

并且:

  

“:scheme”伪标题字段包括以下内容的方案部分:         目标URI([RFC3986],第3.1节)。

     

“:scheme”不限于“ http”和“ https”计划的URI。一种         代理或网关可以转换对非HTTP方案的请求,         允许使用HTTP与非HTTP服务进行交互。

因此,如果要传播HTTP,则应为“ http”,如果要代理HTTPS,则应为“ https”。


再次阅读,可以发现我对问题的理解是错误的(我在考虑HTTP1客户端,HTTP2服务器)。但是以上两个引用仍然是相关的。您无需将:scheme放在HTTP1标头中-它构成您放置在消息起始行中URI的一部分。