在没有实际域的情况下模拟“子域”(在私有网络上)

在没有实际域的情况下模拟“子域”(在私有网络上)

我正在设置一台运行 Apache2 的服务器(Ubuntu Server 18.04),以满足我个人的测试和开发需求。我只能通过其本地 IP(例如http://10.0.0.125)或其在本地网络上的名称(例如http://jeeves)访问它,但目前这样就可以了。

我想在此服务器上创建多个子域,以使不相关的站点保持正确隔离,但我不相信我可以使用实际的子域:http://sub.10.0.0.125由于 IP 不是域,因此不能有子域,因此不起作用,并且由于浏览器将其解释为 TLD 而不是服务器的名称,http://sub.jeeves因此不起作用。.jeeves

因此我想出了另一个解决方案:

<VirtualHost *:80>
    ServerName localhost
    DocumentRoot /var/www/html
    AliasMatch "^/~(.*)" "/var/www/$1"
</VirtualHost>

现在我可以创建一个目录/var/www/sub并通过 访问它http://jeeves/~sub/

我认为这是一个很好的折衷方案……但是,由于它不是子域名,并且不能像子域名那样工作,因此像 这样的链接<a href="/foo/">将引用http://jeeves/foo/而不是所需的http://jeeves/~sub/foo/。我可以在每个网站的代码中处理这个问题,但这远非理想。

我的问题:有什么方法可以让 Apache 处理/~sub/URL 的一部分就像子域名出于所有意图和目的(特别是链接)?也许是某种 BaseDir 指令?我找不到,但这并不意味着不存在类似的东西。

在你提出建议之前:获取该服务器的实际域名有点超出我当前的需求范围;运行专用的 DNS 服务器似乎增加了太多的复杂性;并且更改每个系统上的主机文件并不完全可扩展(在 iPhone 上也不是一件容易的事)。

我觉得我的解决方案非常适合我的需求,只要它能够起作用。

答案1

类似这样的链接<a href="/foo/">将引用http://jeeves/foo/而不是所需的http://jeeves/~sub/foo/。[…] 是否有任何方法可以让 Apache 将 URL 的 /~sub/ 部分视为子域(尤其是链接)?也许可以使用某种 BaseDir 指令?

但 Apache 并不关心这里的差异。相对 URL/foo/被解析为通过你的网络浏览器,并且 Web 浏览器无法通过 Apache 设置进行配置。只要提供的 URL 是以 开头的路径/,Web 浏览器就会始终将其视为相对于域基础的路径。

运行专用的 DNS 服务器似乎增加了太多的复杂性

你可能依赖专用的 DNS 服务器现在为了解析jeeves名称——它可能正在您的家用路由器内运行,全名可能是jevees.lan.jeeves.home.或类似的名称。(客户端设备通过 DHCP 了解后缀。)

如果你很幸运,路由器将允许你添加自定义静态主机名,例如sub.lan.,如果你非常幸运的是,它甚至可能允许你添加三级域名,例如sub.jeeves.lan.

如果路由器的内部 DNS 服务器不够灵活,或者本地名称解析根本不基于 DNS,那么您就没那么幸运了。请运行您自己的 DNS。


有些人已经建立了托管在“神奇”DNS服务器上的域名,这些域名可以转换<anything>.x.y.z.t.<somedomain>为IP地址x.y.z.t。(我不知道目前存在哪些特定的域名,但xip.io曾经是一个东西。)

这种解决方法(以及购买自己的域名)的一个潜在问题是,大多数家用路由器只会阻止来自外部但解析为“内部” IP 地址的 DNS 响应。(这称为“DNS 重新绑定保护”。)

答案2

您将需要运行一个专用的 DNS 服务器,该服务器可以将您请求的域名转换回您的测试/开发箱 IP 地址。

我之前曾尝试过使用我的开发箱上本地安装的 DNS 解决方案,结果好坏参半,而且有点麻烦。

我购买了一个具有 NAT 反射和充当 DNS 服务器能力的商业级路由器,它允许我输入我的开发域名并将它们指向我的开发箱 IP。然后我像通常一样配置了 Apache 虚拟主机,并且我可以使用 TLD 和 sub.TLD 域名。

正如 grawity 所说,运行你自己的 DNS。这对 Web 开发人员来说是救星。

相关内容