Sockets 将HTTP请求重定向/代理到辅助HTTP服务器 < >我使用一个叫做WebServer的C++库来传递静态HTML文件。在同一台机器上,我有另一台正在运行的Web服务器,我想将一些传入连接重定向到restbed。根据请求,我将决定将某些请求重定向到另一台服务器

Sockets 将HTTP请求重定向/代理到辅助HTTP服务器 < >我使用一个叫做WebServer的C++库来传递静态HTML文件。在同一台机器上,我有另一台正在运行的Web服务器,我想将一些传入连接重定向到restbed。根据请求,我将决定将某些请求重定向到另一台服务器,sockets,networking,restbed,Sockets,Networking,Restbed,如果我能够访问传入HTTP连接的底层套接字,从技术上讲,是否可以将两个套接字相互连接起来 如果不是的话,这方面的通用方法是什么?这两种服务只能有一个TCP端口。是的,您可以通过打开到另一个HTTP服务器的连接,将请求转发到该服务器,然后将响应转发回原始客户端来响应HTTP请求。事实上,面向Internet的系统通常会包含某种“前端”或“反向代理”或“L7负载平衡器”或“API网关”,它们正是这样做的,通常会在过程中应用某种身份验证、输入验证或路由逻辑 如果您是自己构建的,那么它并不像打开第二个H

如果我能够访问传入HTTP连接的底层套接字,从技术上讲,是否可以将两个套接字相互连接起来


如果不是的话,这方面的通用方法是什么?这两种服务只能有一个TCP端口。

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

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

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

在回应方面也是如此。您可能应该复制一些标题,如
内容类型
,但其他标题,如
内容长度
,将由您的服务器设置,因此您不应该复制这些标题。尝试从不复制头开始,看看它是否有效,然后复制单个头来解决您发现的问题。您可能至少需要复制
内容类型

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


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

哇,非常感谢您提供了详细的答案!这正是我所需要的。特别是L7/反向代理是我需要的关键字。再次感谢!