如何给 saas 软件提供 cname 前向支持

Posted

技术标签:

【中文标题】如何给 saas 软件提供 cname 前向支持【英文标题】:How to give cname forward support to saas software 【发布时间】:2010-11-01 19:56:21 【问题描述】:

我有一个网络应用程序,用户可以在其中创建他们的帐户并使用该服务。现在我想给他们一个自定义域设施 app.customer1web.com points_to myservice.com with userid customer1 一旦他设置了自定义域,对于世界来说,我的服务看起来就像在他的机器上运行。 博客、wp.com、tumblr 等许多服务都提供 这个功能。

我该怎么做? 我正在使用 java 编写我的网络应用程序。 请求进来时如何将域名映射到用户ID?

【问题讨论】:

【参考方案1】:

请求进来时如何将域名映射到用户ID?

显然,您必须将这些信息存储在某个地方,很可能是在数据库中。

    添加带有列的数据库表domains

    客户 ID 姓名 活动(1 或 NULL) 挑战

    为 (name, active) 添加唯一键以确保域名仅映射一次。

    当客户尝试添加域时,添加一个带有 active=NULL 的行并将挑战设置为随机字符串。

    向客户显示随机字符串,并要求他们在网站上放置一个带有它的网页,或者用它创建一个虚拟 DNS 记录来验证域所有权(这就是 Google Apps 的做法)。

    您可以通过向管理联系人发送电子邮件或其他方式来验证所有权。

    当客户说他按照您在第 2 步中指示他们执行的操作时,验证它并设置 active=1,challenge=NULL。

    如果该域之前对其他客户有效,请删除这些记录或设置 active=0。

    要求客户为其域添加 CNAME 记录并将其转发到您的域,例如hosted.myservice.com(Google 将 ghs.google.com 用于 Google Apps)。

    当有请求进来时,做

    SELECT customerId FROM domains WHERE name=:requestDomain AND active=1
    

更好的方法可能是自动为您的客户提供<customername>.myservice.com 格式的域,除了自定义域。这给您带来了两个好处:

不想使用自己的域的客户仍然可以自定义他们的登录页面,例如带有公司徽标。

对于自定义域,您可以要求您的客户将它们转发到 <customername>.myservice.com 而不是通用的 hosted.myservice.com

这使您可以在多台服务器之间水平划分客户,而无需要求客户在他们的终端上进行任何更改。例如,您可以让客户选择是否希望他们的帐户托管在欧盟或美国。当他们更改它时,只需传输他们的数据并更新<customername>.myservice.com。他们的自定义域将自动运行。

为此,您必须为 *.myservice.com 设置通配符 DNS 记录(除非您还需要后一个功能,在这种情况下您必须管理各个记录)。

【讨论】:

我认为这是一个很好的答案。我学到了一些东西,谢谢,Jaka! 为什么必须验证域所有权?如果他们可以添加 CNAME,这还不够吗? @ChristianDavén 您需要 CNAME 验证!让我们以 tumblr 为例(我相信它有这个问题)。 ABC公司即将推出。他们将通过 blog.ABC.com 启动。邪恶公司 XYZ 在 tumblr 上注册 CNAME blog.ABC.com 以在 ABC 之前指向他们的博客。如果没有验证它应该指向哪个博客? 这是一个很好的答案,但应注意 SSL 可能是此设置的问题。 @jaka-jančar 在完成这一切之后,我们如何管理自定义域的 SSL 证书?【参考方案2】:

您可以使用的一种解决方案是为您的应用程序设置 WildCard DNS Record,并让应用程序本身检查 RequestURI 以查看用户进入的主机名。

我知道这是一个非常模糊的答案,但听起来像是设置了 WildCard 记录,使用单个函数检查主机名是您最好的选择。这样一来,您就不必在每次客户注册时都设置 DNS 记录,而且您有更多的时间来做其他事情……比如为您的应用程序添加新功能!

【讨论】:

【参考方案3】:

我不太确定我是否真的了解您想要做什么,但我尝试为您提供一个可能的解决方案(至少对于您的问题的 Java 部分)。

一种可能性是设置您的应用程序服务器,使每个请求都由一个 Servlet (web.xml) 处理。这个 servlet 可以找到请求 url (HttpServletRequest.getRequestURI) 并提取用户名。然后您就可以了解该用户,并可以将这些信息用于您想做的任何事情。

请注意,您想做的事情涉及很多 DNS 内容! (至少和我理解的一样。)

【讨论】:

【参考方案4】:

@jaka 的回答得到了很好的解释。要添加更多内容,如果您使用 ngnix 作为 LB,它可以使用以下配置转发原始主机名。

proxy_set_header Host $host;

如果您使用的是 express (nodejs),则可以从请求标头中读取 hostname(cname)。您可以使用 cname 和用户 cookie 进行授权检查。

对于证书,您可以使用 *.example.com(通配符)。

【讨论】:

以上是关于如何给 saas 软件提供 cname 前向支持的主要内容,如果未能解决你的问题,请参考以下文章

saas啥意思

纯干货 |这么经营SaaS公司才能赚!

关于云的三种服务类型

企业说 | SaaS 模式的十大误区

国内企业级saas软件平台都有哪些推荐?

ISSA PAAS SAAS的区别