我正在设置一台运行 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 开发人员来说是救星。