通过修改 /etc/hosts 提供子域路由(如何在远程服务器上执行此操作?)

通过修改 /etc/hosts 提供子域路由(如何在远程服务器上执行此操作?)

我正在使用一款复杂且文档不全的软件(sfDomainRoute插件) 为我的网站提供子域名功能。我使用 Apache 作为 Web 服务器,并在服务器上运行无头 Ubuntu 10.0.4 LTS。

经过多次反复尝试后,我发现使我生成的子域名链接正常工作(而不会出现“未找到服务器”错误)的唯一方法是将子域名硬编码到我的 /etc/hosts 文件中。

当我在本地主机上测试时,这种方法很有效 - 但是,我想将解决方案部署到运行多个虚拟服务器(不同网站)的远程服务器。远程服务器根本不使用 /etc/hosts 文件,因为每个网站都有一个唯一的名称。

我的问题是:我可以简单地在 etc/hosts 文件中输入硬编码的域条目(以及静态 IP 地址)吗?或者还有其他方法可以做到这一点?

我建议的方法是修改远程服务器上的 /etc/hosts 文件,如下所示:

123.456.789.123    foo.example.com
123.456.789.123    foo1.example.com
123.456.789.123    foo2-bar.example.com

其中 123.456.789.123 是远程服务器的静态 IP。

这是可行的方法吗?

我将特别感谢那些在生产环境中成功使用 sfDomainRoutePlugin 实现类似目的的人。

答案1

如果所有子域名必须由一个物理站点提供服务,您必须:

  • 在 DNS 区域写入 smth.like

    www 在 AIP地址

    某个名字在另一个 IP 地址/如果需要的话/

    • 在 CNAME www

最后的记录将给你所有和任何未定义在区域名称中以 www 的 IP 作为答案

  • 在托管控制面板中将 *.domainname 定义为 www 站点的别名

我可以简单地在 etc/hosts 文件中输入硬编码的域条目(以及静态 IP 地址)吗?

不可以。通过主机,您将能够将请求路由到正确的服务器,但如果不知道子域映射,它将无法处理请求(这些站点对于服务器不存在)

答案2

由于您的所有域/子域都使用相同的 IP 地址,因此我们无需担心任何反向代理。请参阅下面的一些示例。这些示例适用于不同的域,但对子域同样有效。您不需要编辑您的 hosts 文件。

# Ensure that Apache listens on port 80
Listen 80

# Listen for virtual host requests on all IP addresses
NameVirtualHost *:80

<VirtualHost *:80>
DocumentRoot /www/example1
ServerName www.example1.com

# Other directives here

</VirtualHost>

<VirtualHost *:80>
DocumentRoot /www/example2
ServerName www.example2.org

# Other directives here

</VirtualHost> 

另外,对每个子域执行 ping 操作。如果它们没有返回您的静态 IP 地址,那么您就知道这是 DNS/记录问题。您可能需要再次查看域名注册的设置或等待 DNS(通常需要 15 分钟到 1 小时)启动。

相关内容