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

时间:2020-05-17 20:18:40

标签: sockets networking restbed

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

如果我可以访问传入的HTTP连接的基础套接字,在技术上是否可以并且建议将两个套接字相互连接?

如果没有,什么是通用方法?我只能为两个服务使用一个TCP端口。

1 个答案:

答案 0 :(得分:1)

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

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

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

如果您只是从第二台服务器提供静态文件,那么仅发送HTTP方法和URL并忽略其他请求标头,就可以使工作正常。

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

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

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