将 HTTP 请求重定向/代理到辅助 HTTP 服务器



我使用一个名为restbed的C++库作为Web服务器来传递静态HTML文件。在同一台机器上,我运行了另一个网络服务器,我想将一些传入的连接重定向到 restbed。根据请求,我会决定将某些请求重定向到其他服务器。

如果我可以访问传入 HTTP 连接的底层套接字,技术上是否可行建议将两个套接字相互连接?

如果没有,对此的常见方法是什么?两个服务我只能有一个TCP端口。

是的,您可以通过打开与另一个 HTTP 服务器的连接,将请求转发到该服务器,然后将响应转发回原始客户端来响应 HTTP 请求。事实上,面向 Internet 的系统通常会包含某种"前端"或"反向代理"或"L7 负载均衡器"或"API 网关"来执行此操作,通常在此过程中应用某种身份验证、输入验证或路由逻辑。

如果你自己构建这个,它并不像打开一个套接字到第二个HTTP服务器并逐字转发请求那么简单。您应该使用一些 HTTP 客户端库将请求发送到第二个服务器。换句话说,接收原始请求的 HTTP 服务器应该转身成为第二个服务器的 HTTP 客户端。为第二台服务器准备请求时,应从原始请求中复制部分数据(但不是全部数据(。

  • 您应该复制 HTTP 方法和 URL。
  • 您可能
  • 不应该复制方案(http:或https:(,因为客户端选择连接到原始服务器的方式不必影响该服务器连接到第二台服务器的方式;您可能对原始服务器使用 HTTPS,但使用 HTTP 转发请求。
  • 不应复制Host标头,除非由于某种原因已将第二台服务器配置为响应与原始服务器相同的主机名。
  • 不应复制会混淆用于连接到第二台服务器的 HTTP 客户端库的标头。例如,如果客户端向您发送Accept-Encoding: gzip那么它声称能够接受 gzip 响应,但如果您转发该标头,则第二个服务器将认为您在服务器中使用的 HTTP 客户端库可以接受 gzip 响应,无论它实际上是否可以。
  • 如果希望第二个服务器能够发送304 Not Modified(如果客户端已有该文件(,则应转发缓存控制标头。

如果您只是从第二台服务器提供静态文件,那么您可能只需发送 HTTP 方法和 URL 并忽略其他请求标头即可获得某些工作。

在响应方面也是如此。您可能应该复制一些标头,例如Content-Type,但其他标头(如Content-Length(将由您的服务器设置,因此您不应复制这些标头。尝试从不复制标头开始,看看它是否有效,然后复制单个标头以解决您发现的问题。您可能至少需要复制Content-Type.

HTTP有很多功能,我不能指望在这里经历所有可能的情况。我想说的一点是,你不能只是将所有标头从一个请求或响应复制到另一个请求或响应中,因为其中一些可能不适用,但你也不能只复制任何一个。您必须了解标头的作用并适当地处理它们。

应保留哪些标头在很大程度上取决于您在第一个服务器中对请求和响应的处理量。第一个服务器处理或解释请求和/或响应的次数越多,它与第二个服务器的交互就越独立于它与客户端的交互,并且应复制的标头就越少。

最新更新