Redirecting/proxying 对辅助 HTTP 服务器的 HTTP 请求
Redirecting/proxying a HTTP request to a secondary HTTP server
我使用名为 restbed 的 C++ 库作为 Web 服务器来传送静态 HTML 文件。在 same 机器上,我有另一个网络服务器 运行,我想将一些传入连接重定向到 restbed。根据请求,我会决定将某些请求重定向到另一台服务器。
如果我可以访问传入 HTTP 连接的底层套接字,建议 和 将两个套接字相互连接在技术上是否可行?
如果不是,那么常见的方法是什么?我只能为两种服务使用一个 TCP 端口。
是的,您可以通过打开与另一台 HTTP 服务器的连接,将请求转发到该服务器,然后将响应转发回原始客户端来响应 HTTP 请求。事实上,Internet-facing 系统通常包含某种 "front end" 或 "reverse proxy" 或 "L7 load balancer" 或 "API gateway" 正是这样做的,通常应用某种身份验证、输入验证或流程中的路由逻辑。
如果您自己构建它,它并不像打开到第二个 HTTP 服务器的套接字并逐字转发请求那么简单。您应该使用一些 HTTP 客户端库将请求发送到第二个服务器。换句话说,接收到原始请求的 HTTP 服务器应该转身成为第二个服务器的 HTTP 客户端。在为第二个服务器准备请求时,您应该从原始请求中复制一些但不是全部数据。
- 您应该复制 HTTP 方法和 URL。
- 您可能不应该复制方案(http: 或 https:),因为客户端选择连接到原始服务器的方式不一定会影响该服务器连接到第二台服务器的方式;您可能对原始服务器使用 HTTPS,但使用 HTTP 转发请求。
- 您不应复制
Host
header 除非出于某种原因第二个服务器已配置为响应与原始服务器相同的主机名。
- 您不应复制 header,否则会混淆您用于连接到第二个服务器的 HTTP 客户端库。例如,如果客户端向您发送
Accept-Encoding: gzip
那么它声称能够接受压缩响应,但是如果您转发 header,第二个服务器将认为您正在使用的 HTTP 客户端库在您的服务器中可以接受 gzipped 响应,无论它是否真的可以。
- 如果您希望第二个服务器能够发送
304 Not Modified
如果客户端已经有文件,您应该转发缓存控制 headers。
如果您只是从第二个服务器提供静态文件,那么您可能只需发送 HTTP 方法和 URL 并忽略其他请求 headers 就可以使某些东西正常工作.
响应端也是类似的情况。您可能应该复制一些 header,例如 Content-Type
,但是其他的,例如 Content-Length
,将由您的服务器设置,因此您不应该复制那些 header。尝试从不复制 headers 开始,看看它是否有效,然后复制单个 headers 来解决您发现的问题。您可能至少需要复制 Content-Type
.
HTTP有很多特点,我不希望在这里一一列举所有可能的情况。我想说明的一点是,您不能只将一个请求或响应中的所有 header 复制到另一个请求或响应中,因为其中一些可能不适用,但您不能只复制 none 他们中的任何一个。您必须了解 header 的作用并适当地处理它们。
您应该保留哪些 headers 在很大程度上取决于您在第一台服务器上对请求和响应的处理程度。第一个服务器处理或解释请求 and/or 响应的次数越多,它与第二个服务器的交互就越独立于它与客户端的交互,并且您应该复制的 headers 越少。
我使用名为 restbed 的 C++ 库作为 Web 服务器来传送静态 HTML 文件。在 same 机器上,我有另一个网络服务器 运行,我想将一些传入连接重定向到 restbed。根据请求,我会决定将某些请求重定向到另一台服务器。
如果我可以访问传入 HTTP 连接的底层套接字,建议 和 将两个套接字相互连接在技术上是否可行?
如果不是,那么常见的方法是什么?我只能为两种服务使用一个 TCP 端口。
是的,您可以通过打开与另一台 HTTP 服务器的连接,将请求转发到该服务器,然后将响应转发回原始客户端来响应 HTTP 请求。事实上,Internet-facing 系统通常包含某种 "front end" 或 "reverse proxy" 或 "L7 load balancer" 或 "API gateway" 正是这样做的,通常应用某种身份验证、输入验证或流程中的路由逻辑。
如果您自己构建它,它并不像打开到第二个 HTTP 服务器的套接字并逐字转发请求那么简单。您应该使用一些 HTTP 客户端库将请求发送到第二个服务器。换句话说,接收到原始请求的 HTTP 服务器应该转身成为第二个服务器的 HTTP 客户端。在为第二个服务器准备请求时,您应该从原始请求中复制一些但不是全部数据。
- 您应该复制 HTTP 方法和 URL。
- 您可能不应该复制方案(http: 或 https:),因为客户端选择连接到原始服务器的方式不一定会影响该服务器连接到第二台服务器的方式;您可能对原始服务器使用 HTTPS,但使用 HTTP 转发请求。
- 您不应复制
Host
header 除非出于某种原因第二个服务器已配置为响应与原始服务器相同的主机名。 - 您不应复制 header,否则会混淆您用于连接到第二个服务器的 HTTP 客户端库。例如,如果客户端向您发送
Accept-Encoding: gzip
那么它声称能够接受压缩响应,但是如果您转发 header,第二个服务器将认为您正在使用的 HTTP 客户端库在您的服务器中可以接受 gzipped 响应,无论它是否真的可以。 - 如果您希望第二个服务器能够发送
304 Not Modified
如果客户端已经有文件,您应该转发缓存控制 headers。
如果您只是从第二个服务器提供静态文件,那么您可能只需发送 HTTP 方法和 URL 并忽略其他请求 headers 就可以使某些东西正常工作.
响应端也是类似的情况。您可能应该复制一些 header,例如 Content-Type
,但是其他的,例如 Content-Length
,将由您的服务器设置,因此您不应该复制那些 header。尝试从不复制 headers 开始,看看它是否有效,然后复制单个 headers 来解决您发现的问题。您可能至少需要复制 Content-Type
.
HTTP有很多特点,我不希望在这里一一列举所有可能的情况。我想说明的一点是,您不能只将一个请求或响应中的所有 header 复制到另一个请求或响应中,因为其中一些可能不适用,但您不能只复制 none 他们中的任何一个。您必须了解 header 的作用并适当地处理它们。
您应该保留哪些 headers 在很大程度上取决于您在第一台服务器上对请求和响应的处理程度。第一个服务器处理或解释请求 and/or 响应的次数越多,它与第二个服务器的交互就越独立于它与客户端的交互,并且您应该复制的 headers 越少。