Web 服务器内的重定向/映射

Web 服务器内的重定向/映射

我对网络管理还很陌生,因此很高兴能够成功设置 DNS 记录。

现在我有点困惑,因为我想要这个 URL:

http://www.example.org:8080/fetch/characters/

真正达到这个

http://www.example.org/fetch/characters/

因此用户无需明确设置端口即可访问端口 8080 上的服务。

我该怎么做?我的服务器上需要一些特殊应用程序吗?或者任何重定向要应用于请求的内容吗?

答案1

DNS 记录不能指向端口(除了一些不适用于此处的特殊情况)。

如果您有一个在端口 8080 上监听的 Web 服务,并且想要在不指定此端口的情况下访问它,您有 3 个选择:

  • 使其实际监听端口 80(或带有 https 的 443)。
  • 配置已经在端口 80 上监听的任何内容以将请求转发到端口 8080 上的服务(反向代理)。
  • 如果您可以接受重定向,请使用它而不是代理,但您的客户端将:8080在重定向后在其地址栏中看到该部分。

答案2

Web 服务器默认监听 TCP 端口 80。如果您不想在 URL 中明确输入端口号,则有以下几种选择:

  • 您可以重新配置 Web 服务器以使用端口 80 而不是端口 8080。对于 nginx 或 Apache 等 Web 服务器,建议这样做,但不适用于 Gunicorn 等 Web 服务器。此选项也并非总是可行的,因为该端口可能已被其他 Web 服务器使用。

    此外,当您的服务器位于 NAT 网关后面时,它不拥有公共 IP 地址,并且该公共 NAT 地址和端口 80 的组合可能已经转发到不同的 Web 服务器。

  • 您可以在 Web 服务器前面放置一个反向代理服务器,该服务器接受 TCP 端口 80 上的流量并将其发送到 TCP 端口 8080 上的 Web 服务器。如果端口 80 已在使用中,此方法同样有效。只需将反向代理服务器放在两个 Web 服务器前面,使它们都监听 80 以外的端口即可。

为了提供更好、更详细的帮助,说明哪种选择可能是最佳选择以及限制等,我们需要更多地了解您的设置。希望这个解释已经澄清了一些问题。

答案3

简单回答,与问题级别相关

忽略 DNS 的特殊用途以及反向 DNS 查找(与问题无关),几乎所有 DNS 的使用都具有以下形式:

  1. 客户端将域名(完全限定或其他)发送到 DNS 服务器
  2. DNS 服务器从其记录中返回域信息。通常,请求的关键信息是与该域上的网络/电子邮件进行通信的 IP 地址,或能够更好地提供该信息的另一个 DNS 服务器的 IP 地址。

一旦客户端联系到服务器,服务器本身就会接管,DNS 系统将不再起作用。

这意味着,DNS 系统不需要提供端口信息,而且它几乎从来不提供端口信息。因此,尽管这个问题的目的是正确的,而且经常这样做,但实际上并不是 DNS 系统在做这件事。这就是你无法解决这个问题的原因 :)

这个想法是,一旦您的客户端可以找到它正在寻找的特定机器或服务器,那么该机器就可以监听它选择的任何端口,并接受/拒绝/响应配置的任何端口上的任何协议。

例如,HTTP Web 服务通常在端口 80 上提供。这意味着,一旦客户端知道了计算机 IP,它就可以假设向端口 80 发送消息将导致该消息被该计算机的 Web 服务读取/响应。但事实并非如此。如果服务器配置为在端口 9000 上侦听 Web 传入请求,则任何能够访问端口 9000 的客户端都将能够访问其 Web 服务。如果服务器位于将端口 10000 重定向到端口 9000 的代理/NAT/路由器后面,并且客户端在端口 10000 上发送 Web 请求,则服务器将在端口 9000 上接收该请求并做出响应。

Web 服务器内的重定向/映射

您在评论中询问了重定向映射或重写。这些是 Web 服务器可以执行的功能。基本上,您可以配置 Web 服务器(或大多数/许多 Web 服务器)来管理它如何处理在请求中收到的 URL。因此,它可以在收到请求时内部修改 URL,以使不同的 URL 以相同的方式处理,或修复常见的拼写错误(映射),或者它可以实际响应以告诉客户端本身使用一些不同的替换 URL(重定向)再次询问。

它们有其用途,并且原则上可以处理您的用例,但它们听起来不像是您的“正确”解决方案,原因如下:

  1. 我认为地图根本没用映射几乎完全在网络服务器内部进行,它表示“处理URL 就像URL”。例如,您可以使用 Web 服务器 URL 映射来允许用户使用非常旧的、旧的和当前的 URL(为了方便用户)查询论坛,方法是使用“https://example.com/index.php?area-=forum&topic=2“, 还 ”https://example.com/forum.php?topic=2“ 并且 ”https://forum.example.com?topic=2“,并且只处理一次,通过将前两个映射到第三个 URL 内部,作为处理查询的第一步。由于此目标影响查询路径而不是 IP/端口,因此映射对于端口管理没有多大用处,并且在您的情况下,客户端实际上根本不查询 8080。
  2. 重定向可以工作,但可能不是你想要的。Web 服务器中的重定向依赖于 Web 服务器实际接收查询(因为这些是 Web 服务器内部功能)。因此,Web 服务器无论如何都必须监听端口 80 以获取原始查询,以便使用重定向/映射进行响应。它将必须监听端口 8080。从功能上讲,它需要一条重定向规则来告诉任何查询端口 80 的客户端使用“:8080”URL 再次查询,这听起来不像您想要做的。用户还会看到带有“:8080”的新 URL,而听起来您希望它是“透明的”并且不显示。
  3. 重定向也仅适用于重定向标准端口(80 或 443)- 您无法将端口 2000 重定向到 8080,因为客户端首先默认不会在 2000 上查询,所以即使它在 2000 上监听,它也永远不会到达 Web 服务器。但这对您来说可能不是什么问题。

但是,如果你想要“智能”重定向,其中只有某些查询被重新路由到 8080,这可能是可行的方法,因为重定向可以包含逻辑来决定应该重定向哪些 URL,而端口映射(如下)将映射一切

如何正确做到这一点

你的问题的答案是,你想要 Web 服务器响应客户端发送到默认端口 (80/443) 但服务器实际上在端口 8080 上接收的 Web 请求。

这意味着,正如你所看到的,你需要在这两者之间做一些事情映射客户端和服务器之间的端口。这样,客户端在端口 80(Web 浏览器使用的默认端口)上发送,但 Web 服务器实际上在端口 8080 上接收。当然,您必须将 Web 服务器配置为侦听端口 8080,因为这不是标准配置,但这很容易,任何 Web 服务器都应该能够指定其侦听端口。

最常见的方法是在路由器/防火墙内通过端口映射来实现。

简单来说,要做到这一点,路由器必须遵循一条规则,即收到的任何目标 IP 为 80 且目标端口为 80 的数据包都应传入 LAN,并将目标端口改为 8080。Web 服务器和客户端都不会察觉到这一变化(这 100% 由路由器处理),因此对它们来说都是 100% 透明的。客户端的 URL 中不会有“:8080”,也不需要重定向任何内容,因为它查询的是端口 80;Web 服务器可以忽略端口 80,只监听 8080,因为它从不接收端口 80 上的查询。

如果您想要一种简单、直接的方法,类似于“端口 DNS”所做的那样,这可能是与您在问题中所要求的最接近的方法。

答案4

通过 srv 记录应该可以实现这一点。

https://en.wikipedia.org/wiki/SRV_record

相关内容