我正在编写从HTTP / 2到HTTP / 1的代理,反之亦然。
当我收到一个定义为<?php
foreach($json['offers'] as $offer) {
$image = $offer['picture'];
echo "<img src='$image' />";
}
?>
的传入HTTP / 2请求时,对于我的代理HTTP / 1请求,应将其映射到哪个标头?
我能找到的最接近的东西是here
答案 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)
虽然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的一部分。