【问题标题】:how to show different content based on incoming domain?如何根据传入域显示不同的内容?
【发布时间】:2016-11-15 20:50:43
【问题描述】:

问题

我有点不知所措,如果我想将苹果与面包进行比较,请指出。

我想了解人们是如何做这种对我来说似乎很神奇的特定模式(或一组模式)的。

注意:下面的具体问题(答案需要是对此的解决方案)

图案

1。银河流星托管

DNS config 中,他们要求我们将 CNAME 从 www.customer1.com(您)设置为 galaxy-ingress.meteor.com

这让我大吃一惊,他们如何能够根据源域重定向多个站点。其中许多可能是高流量。这也应该是高性能的。

2。 Github.com 页面

只需在他们的设置中添加您的域,并将 CNAME 设置为他们为您提供的恒定域。完成。

注意:我不太了解细节 - 转发到常量域或您的 GH pages user domain,如 user.github.io,不记得准确了。

3。 Gitlab.com

他们给你一个 IP 来指向一个A record,不过,这对我来说似乎对正常运行时间不太友好。

PS:我爱这些家伙,Git + CI + docker repo 免费,我一定是在做梦。

4。 Heroku

  1. 通过命令行或 Web gui 添加域。
  2. 将 CNAME 添加到您的 app-name.heroku 中

这(就像上面的几个)是最好的,你会得到一个默认的xyz.herokuapp.com URL,即使没有自定义域也可以使用。

5。浪涌.sh

  1. 将域添加到一个名为 CNAME 的文件中(我怀疑,最初,这会起作用,它太简单了:))
  2. 将 CNAME 添加到您的 xyz.surge.sh 网址

6。模数.io

(我可以继续使用这个列表)

具体问题

我想根据上面的设置

    • 当 www.website1.com 有一个 CNAME 指向 ingress.yourwebsite.com 时,显示与其网站相关的内容
    • 当 www.website2.com 有一个 CNAME 指向 ingress.yourwebsite.com 时,显示与其网站相关的内容
  1. 网址应显示 www.website1.com 或 www.wesbite2.com 而不是 ingress.yourwebsite.com
  2. 以编程方式轻松添加新网站
  3. 高性能和正常运行时间友好
  4. 在 IaaS(数字海洋、AWS 等)提供商上实施。 (尽管正如一个答案所暗示的那样,您可以使用 PaaS(Heroku、Modulus 等)提供者的 API,这不是作弊,因为这样做一无所知,因为 API 抽象了实现)

Performant:我的意思是,如果可以在 DNS 层完成,您就不会在应用层执行此操作。

正常运行时间友好:我的意思是,如果服务器实例出现故障,该服务不会停止工作

奖金

如何为 website1.com 和 website2.com 进行这项工作(注意没有 www.)?

www.website1.com 转发到website1.com(或其他方式,取决于您的喜好)

我想像谷歌应用程序一样在内部进行设置,我不希望用户在他们的 DNS 上进行花哨的设置,比如根目录下的 CNAME 等。

技术偏好

如果可能,请使用其中之一,而不是使用它们的竞争对手。当您通过此操作做出次优选择时,请提及。

按顺序:

  1. MeteorJS
  2. NodeJS
  3. Javascript
  4. Cloudflare.com API
  5. Nginx
  6. 任何 github.com 高星(比如 1k+)的 repo

PS:我提到这个偏好不是一个 dou*he,而是重复使用我已经知道的东西。

可能的解决方案(我不是在寻找):

  • iframe(糟糕的 SEO 等)
  • mod_rewrite(是 github 和其他人使用 mod_rewrite,似乎是应用级别和 kludgy)

更新 #1(2016 年 7 月 13 日)

我尝试过的

    • 使用自定义域(例如 xyz.com)将流星JS 应用程序部署到 heroku,并尝试以编程方式路由 a.xyz.com 等,出现此域中不存在 herokuapp 等错误。
    • 阅读了很多关于 hoerku 通配符域的信息,但没有帮助
    • 使用自定义域(例如 xyz.com)将meteorJS 应用程序部署到meteor.com 并尝试以编程方式路由a.xyz.com 等,出现错误,例如该域中不存在meteor 应用程序。
    • 他们没有提供对 DNS 的访问权限(我认为这需要在这个地方工作)
    • meteor.com 免费托管已关闭
    • 我猜这应该比我制作的缠结的毛线球更容易。
    • 如果我可以像website1.yourwebsite.com 这样以编程方式设置CNAMEs(使用cloudflare.com API,这可能吗?)然后当有人点击website1.yourwebsite.com 时,我应该知道基于URL(应用程序级别)提供哪些内容) 那么我可以对实际主机做一个301 redirect 吗? URL 在301 redirect 上更改。该死!

更新 #2(2016 年 7 月 30 日)

    • 更新了问题以阐明这需要在 IaaS(数字海洋、AWS 等)上实施。如果您使用的是 PaaS(Heroku、Modulus 等)提供商的 API,您仍然不知道这种模式是如何实现的,它已经被 API 抽象掉了。

【问题讨论】:

  • 这看起来很好研究,但不清楚您期望什么样的答案?也许你会在单独的、具体的问题上取得更大的成功。
  • @DusanBajic 我正在寻找具体问题的答案。将更新问题以更清楚地说明这一点

标签: heroku dns github-pages cloudflare meteor-galaxy


【解决方案1】:

作为 Modulus 的一名员工,我可以提供一些关于其工作原理的见解。或者至少它在 Modulus 平台上是如何工作的。

我们使用传入的host header / SNI 来了解将流量路由到哪个项目。我们有负载平衡器 -> 主机 -> 伺服器。当您的应用程序收到请求时,它会访问我们的负载均衡器,该负载均衡器具有静态 IP 地址(或多或少)。我们的负载均衡器在内存数据库中进行主机查找以查找应用程序的位置。负载均衡器将请求路由到项目所在的主机,然后路由到项目所在的确切伺服器。响应来自应用程序,该应用程序从伺服器返回到主机,然后返回到负载均衡器,负载均衡器在响应离开负载均衡器并返回之前检查一些事情(例如是否为您的项目设置了 SSL)访问您的应用程序的人。当您在模数项目仪表板的“指标”部分查看项目指标时,“响应时间”图表会显示此过程对于您的应用程序的给定路由发生所需的时间。

当您将自定义域放入组合中时,其工作原理几乎相同。您设置 DNS 以使用“A 记录”将您的域解析到我们的负载均衡器。您也可以使用 CNAME,但我认为 A 记录效果最好。使用 A 记录,您可以定义所有流量首先路由到哪个负载均衡器。这可能会影响诸如 x-forwarded-for 之类的事情。您可以在我们的服务here 上阅读有关使用自定义域的更多信息。我们可以更深入地了解这部分,但在那篇“自定义域”文章中对此进行了很好的解释。

关于以编程方式设置项目/应用的问题,最好为每个应用/网站设置一个单独的项目。那将是最简单的。您可以创建一个项目,该项目以编程方式创建具有自定义域的其他项目,但您必须对我们的 CLI 进行逆向工程,或者等到我们发布我们的公共 API(这应该在几个月后发生)。

如果您想对我们的 CLI 进行逆向工程,您可以通过分析我们的开源 here 来实现。您必须先在 CLI 中创建一个令牌,方法是先执行 $ modulus token create,然后您才能使用它向 https://api.onmodulus.net/<XYZ or project etc>?create&authToken=<authToken goes here> 发出 API 请求

如果你想更多地聊天,你可以随时在 Meteor Chef Slack 群中找到我,你可以加入 here

我希望这些基本信息可以为您解决这个问题提供一些指导。 :)

【讨论】:

  • 感谢您花时间回答这个问题。这更好地解释了事情,尽管有几点是特定于模数的。我希望自己知道如何在数字海洋或 AWS 中进行设置。让我更新问题以澄清这一点。
猜你喜欢
  • 2013-05-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-06-07
  • 1970-01-01
  • 1970-01-01
  • 2013-07-04
  • 1970-01-01
相关资源
最近更新 更多