我有一个简单的rails应用程序
(browser) -> (nginx latest; proxy_pass) -> rails (latest)如何配置nginx以通知rails nginx通过不同的头IE接收了HTTP/2请求: my_"http_version = 2.0"?proxy_pass通过HTTP1.1与rails通信,我想知道最初的请求是否为http/2。
谢谢!
发布于 2016-01-17 14:28:17
这类似于X-Forwarded-For和X-Forwarded-Proto头的用途,但是没有一个标准报头用于将HTTP版本与后端通信。我建议使用以下方法:
proxy_set_header X-Forwarded-Proto-Version $http2;$http2变量来自模块,我猜想您正在使用Nginx来服务器HTTP/2。
$http2和$server_protocol的不同之处在于,如果使用HTTP/1协议,$http2的工作方式更像是布尔值,显示为空白。$server_protocol将包含“HTTP1.1”或“HTTP2.0”这样的值,因此它也可能是一个很好的选择,取决于您的需求。
发布于 2016-03-23 23:00:55
我可以告诉你我们做了什么,但你可能觉得很奇怪。如果您不关心连续地信任和查看多个代理,您可能可以采用其他答案所描述的更简单的方法。
首先,我们的应用程序必须支持查看由客户运行和维护的代理。在我们的应用服务器上,我们总是需要记住,请求可能通过多个代理传递,对于一些客户来说,我们实际上必须支持这个用例,这样应用程序就可以看到多个代理来获得原始的头。
为了在我们的应用程序中支持上游代理,我们有一个请求过滤器来分析X-Forwarded-For头值以及远程主机IP。然后,我们分解所有的X-Forwarded-*代理头值,并“解压”它们,前提是我们确信它们是由可信代理添加的,这些代理的头配置是以合同方式建立的(这些将是我们应用程序中特定的预先配置的IP)。这个过程非常复杂,所以我要说的就是这些。但是,我们从中得到:
在我们的应用程序中,我们专门为HTTP/2所做的工作是优化(例如,不要连接JS文件),但是代理链中的任何HTTP/1.x连接都会限制性能。因此,我们只关心整个请求链是否从头到尾都是HTTP/2。因此,我们要求所有支持HTTP/2的上游代理实现我们发明的特殊报头,让我们称之为H2-IP。
如果任何上游代理接收到HTTP/2请求,我们要求代理将远程主机的附加到H2-IP头。然后,在服务器端,我们将迭代由可信任的配置代理(上面#1)传递的可信任的远程IP列表,并确保每个代理都列在H2-IP报头中。
例如:
在这个例子中,远程主机(10.20.30.40)被发现是一个受信任的代理,并且我们通过契约知道这个代理将发送所有三个X转发的-(对于HostHost维多Proto)头。因此,我们从每个标头中取出最后一个值,使用那些未剥离的值作为可信的请求数据,然后对每个X转发的IP重复这个过程,直到我们找到一个不受信任的代理。下面是我们最后得到的数据:
因此,由于整个可信赖的IP链是HTTP/2远程IP的子集,所以我们知道这个请求从开始到结束都是完全HTTP/2的。
如果您不关心连续地信任和查看多个代理,您可能可以采用其他答案所描述的更简单的方法。
发布于 2016-01-17 14:28:07
proxy_set_header X转发-ProtoVersion $server_protocol;
注意:X转发-ProtoVersion是一个由变量组成的名称.我不知道标准是什么。
https://stackoverflow.com/questions/34839292
复制相似问题