【问题标题】:Redirecting/proxying a HTTP request to a secondary HTTP server将 HTTP 请求重定向/代理到辅助 HTTP 服务器
【发布时间】:2020-05-17 20:18:40
【问题描述】:

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

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

如果不是,那么常见的方法是什么?我只能为这两种服务使用一个 TCP 端口。

【问题讨论】:

    标签: sockets networking restbed


    【解决方案1】:

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

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

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

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

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

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

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

    【讨论】:

    • 哇,非常感谢您的详细回答!这正是我所需要的。特别是 L7/反向代理是我需要的关键字。再次,非常感谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-02-28
    • 1970-01-01
    • 2018-02-22
    • 2020-05-03
    • 2012-11-08
    • 1970-01-01
    相关资源
    最近更新 更多