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

时间:2009-06-10 14:16:45

标签: java dns saas cname

我有一个webapp,用户可以在其中创建自己的帐户并使用该服务。现在我想给他们一个自定义域名设施 app.customer1web.com points_to myservice.com with userid customer1 一旦他设置了自定义域名,对于世界而言,我的服务似乎就在他的机器上运行。 许多服务,如博客,wp.com,tumblr给 这个功能。

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

4 个答案:

答案 0 :(得分:12)

  

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

显然,您必须将信息存储在某个地方,最有可能存储在数据库中。

  1. 使用列添加数据库表domains

    • 客户ID
    • 名称
    • 有效(1或NULL)
    • 挑战

    为(名称,活动)添加唯一键以确保域名仅映射一次。

  2. 当客户尝试添加域时,添加一个active = NULL且challenge设置为随机字符串的行。

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

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

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

    如果该域之前曾为某个其他客户处于活动状态,请删除这些记录或设置active = 0.

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

  5. 当请求进来时,请执行

    SELECT customerId FROM domains WHERE name=:requestDomain AND active=1
    
  6. 除了自定义域之外,更好的方法是自动为您的客户提供<customername>.myservice.com格式的域名。这有两个好处:

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

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

      这使您可以在多个服务器之间水平分区客户,而无需要求客户更改任何内容。例如,您可以为客户提供选择,让他们选择是否希望他们的帐户在欧盟或美国托管。当他们更改它时,只需传输他们的数据并更新<customername>.myservice.com。他们的自定义域名将自动生效。

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

答案 1 :(得分:1)

您可以使用的一个解决方案是为您的应用程序设置WildCard DNS Record,并让应用程序自己检查RequestURI以查看用户正在使用的主机名。

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

答案 2 :(得分:0)

我不太确定我是否真的明白你想做什么,但我试着给你一个可能的解决方案(至少对你问题的Java部分而言)。

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

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

答案 3 :(得分:0)

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

proxy_set_header Host $host;

如果你使用 express (nodejs),你可以从请求头中读取主机名(cname)。您可以使用 cname 和用户 cookie 进行授权检查。

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