【发布时间】:2019-12-28 18:53:31
【问题描述】:
我正在尝试使用 Spring Boot 作为后端和 Angular 作为前端来构建多租户应用程序。我正在考虑将它部署在 IBM Cloud 上。
这个想法是给每个客户端一个子域来访问应用程序。比如我访问应用的域名是app.com,那么Client1也可以使用client1.app.com访问应用。
然后在 Angular 中,我使用此代码提取该子域以查询数据库:
getSubdomain() {
const domain = window.location.hostname;
if (domain.indexOf('.') < 0 ||
domain.split('.')[0] === 'example' || domain.split('.')[0] === 'lvh' || domain.split('.')[0] === 'www') {
this.subdomain = '';
} else {
this.subdomain = domain.split('.')[0];
}
console.log('subdomain is:'+ this.subdomain);
}
但我仍然不知道如何让我的应用程序在开发和生产环境中都响应 subdomians。
目前在我的开发环境中,我只能使用 localhost:3000 访问应用程序。我尝试通过添加 gado.com 、 abc.gado.com 来编辑主机文件(在 Windows 上),但是虽然我可以 ping 这些名称,但我无法使用任何名称访问应用程序。
在生产中,我不知道如何实现这一点。我的意思是这是一个应用程序还是 HTTP 服务器?
更新
对不起,如果我不够清楚。我将根据我认为应该如何完成的想法将要求分解为步骤。请随时纠正我或填补任何空白。
假设我有一个应用程序部署在公共 IP 为 9.9.9.9 的服务器上。
1- 现在让人们使用域名 gado.com 访问这个应用程序,例如,我应该怎么做?根据我有限的知识,我应该去 ISP 或托管供应商并购买一个域名,然后 ISP 使用 DNS 服务器将其映射到我的服务器的 IP 地址。
2- 我还希望用户使用任何子域访问相同的应用程序/IP(子域必须始终存在于浏览器的 URL 字段中)。根据我的研究,我发现了通配符子域的概念,您可以在其中插入 * 而不是子域名。但是当我向托管供应商询问这个问题时,他们说他们不提供这个功能。所以我应该尝试另一个供应商还是我应该实施的东西。
我之前做过类似的事情,该应用程序部署在云上,但要访问它,用户必须使用具有 VM ip 地址https://ip-address/GxSystems/faces/SignIn 的 URL。为了更容易,我使用了公司的 cpanel 并添加了一个新的子域并将其映射到上面的 url。唯一的问题是它只是重定向。网址从 sub.domain.com 更改为应用程序的原始网址,这不是我想要的。我希望网址保持“sub.domain.com”
3- 是否必须在托管应用程序的机器上进行任何配置或设置。我的意思是该机器上的 Web 服务器的配置以适应前面的步骤。
所以我认为我的问题基本上是将我的应用程序服务器映射到域名和通配符子域而不是直接使用它的 IP 地址的步骤是什么?
【问题讨论】:
标签: angular spring-boot networking ibm-cloud subdomain