![通过修改 /etc/hosts 提供子域路由(如何在远程服务器上执行此操作?)](https://linux22.com/image/1291161/%E9%80%9A%E8%BF%87%E4%BF%AE%E6%94%B9%20%2Fetc%2Fhosts%20%E6%8F%90%E4%BE%9B%E5%AD%90%E5%9F%9F%E8%B7%AF%E7%94%B1%EF%BC%88%E5%A6%82%E4%BD%95%E5%9C%A8%E8%BF%9C%E7%A8%8B%E6%9C%8D%E5%8A%A1%E5%99%A8%E4%B8%8A%E6%89%A7%E8%A1%8C%E6%AD%A4%E6%93%8D%E4%BD%9C%EF%BC%9F%EF%BC%89.png)
我正在使用一款复杂且文档不全的软件(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 小时)启动。