我对网络管理还很陌生,因此很高兴能够成功设置 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 的使用都具有以下形式:
- 客户端将域名(完全限定或其他)发送到 DNS 服务器
- 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(重定向)再次询问。
它们有其用途,并且原则上可以处理您的用例,但它们听起来不像是您的“正确”解决方案,原因如下:
- 我认为地图根本没用映射几乎完全在网络服务器内部进行,它表示“处理这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。
- 重定向可以工作,但可能不是你想要的。Web 服务器中的重定向依赖于 Web 服务器实际接收查询(因为这些是 Web 服务器内部功能)。因此,Web 服务器无论如何都必须监听端口 80 以获取原始查询,以便使用重定向/映射进行响应。它将还必须监听端口 8080。从功能上讲,它需要一条重定向规则来告诉任何查询端口 80 的客户端使用“:8080”URL 再次查询,这听起来不像您想要做的。用户还会看到带有“:8080”的新 URL,而听起来您希望它是“透明的”并且不显示。
- 重定向也仅适用于重定向标准端口(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 记录应该可以实现这一点。