首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何通过代理转发http 2协议版本?

如何通过代理转发http 2协议版本?
EN

Stack Overflow用户
提问于 2016-01-17 14:12:37
回答 3查看 5.8K关注 0票数 5

我有一个简单的rails应用程序

代码语言:javascript
复制
(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。

谢谢!

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2016-01-17 14:28:17

这类似于X-Forwarded-ForX-Forwarded-Proto头的用途,但是没有一个标准报头用于将HTTP版本与后端通信。我建议使用以下方法:

代码语言:javascript
复制
proxy_set_header X-Forwarded-Proto-Version $http2;

$http2变量来自模块,我猜想您正在使用Nginx来服务器HTTP/2。

$http2$server_protocol的不同之处在于,如果使用HTTP/1协议,$http2的工作方式更像是布尔值,显示为空白。$server_protocol将包含“HTTP1.1”或“HTTP2.0”这样的值,因此它也可能是一个很好的选择,取决于您的需求。

票数 9
EN

Stack Overflow用户

发布于 2016-03-23 23:00:55

我可以告诉你我们做了什么,但你可能觉得很奇怪。如果您不关心连续地信任和查看多个代理,您可能可以采用其他答案所描述的更简单的方法。

首先,我们的应用程序必须支持查看由客户运行和维护的代理。在我们的应用服务器上,我们总是需要记住,请求可能通过多个代理传递,对于一些客户来说,我们实际上必须支持这个用例,这样应用程序就可以看到多个代理来获得原始的头。

为了在我们的应用程序中支持上游代理,我们有一个请求过滤器来分析X-Forwarded-For头值以及远程主机IP。然后,我们分解所有的X-Forwarded-*代理头值,并“解压”它们,前提是我们确信它们是由可信代理添加的,这些代理的头配置是以合同方式建立的(这些将是我们应用程序中特定的预先配置的IP)。这个过程非常复杂,所以我要说的就是这些。但是,我们从中得到:

  1. 代表链中所有“可信赖的”远程in的in列表。
  2. 最“可信”的原始头值,这些值将被应用程序用于URL生成等。

在我们的应用程序中,我们专门为HTTP/2所做的工作是优化(例如,不要连接JS文件),但是代理链中的任何HTTP/1.x连接都会限制性能。因此,我们只关心整个请求链是否从头到尾都是HTTP/2。因此,我们要求所有支持HTTP/2的上游代理实现我们发明的特殊报头,让我们称之为H2-IP

如果任何上游代理接收到HTTP/2请求,我们要求代理将远程主机的附加到H2-IP头。然后,在服务器端,我们将迭代由可信任的配置代理(上面#1)传递的可信任的远程IP列表,并确保每个代理都列在H2-IP报头中。

例如:

  • 可信代理IP(预配置):11.22.33.44、9.8.7.6、10.20.30.40、127.0.0.1、45.235.235.200
  • 远程主机: 10.20.30.40
  • 是HTTP/2吗?是
  • 转发-为标题: 23.45.67.78,11.22.33.44
  • 转发-主机头: malicious.user.injected.value,app.customer.com,internalproxy.mycompany.com
  • 转发-Proto报头: http,https,https
  • H2-IP报头: 23.45.67.78,11.22.33.44

在这个例子中,远程主机(10.20.30.40)被发现是一个受信任的代理,并且我们通过契约知道这个代理将发送所有三个X转发的-(对于HostHost维多Proto)头。因此,我们从每个标头中取出最后一个值,使用那些未剥离的值作为可信的请求数据,然后对每个X转发的IP重复这个过程,直到我们找到一个不受信任的代理。下面是我们最后得到的数据:

  • 原始远程主机:23.45.67.78
  • 原始主机标题:app.customer.com (注意:我们丢弃了一个不受信任的值)
  • 原始方案:https (注意:我们丢弃了一个不受信任的值)
  • 可信IP链:23.45.67.78 -> 11.22.33.44 -> 10.20.30.40 ->应用程序
  • HTTP/2远程IP:23.45.67.78,11.22.33.44,10.20.30.40

因此,由于整个可信赖的IP链是HTTP/2远程IP的子集,所以我们知道这个请求从开始到结束都是完全HTTP/2的。

如果您不关心连续地信任和查看多个代理,您可能可以采用其他答案所描述的更简单的方法。

票数 1
EN

Stack Overflow用户

发布于 2016-01-17 14:28:07

proxy_set_header X转发-ProtoVersion $server_protocol;

注意:X转发-ProtoVersion是一个由变量组成的名称.我不知道标准是什么。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/34839292

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档