Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to give cname forward support to saas software

Tags:

java

dns

saas

cname

I have a webapp where users can create their account and use the service. Now I want to give them a custom domain facility where app.customer1web.com points_to myservice.com with userid customer1 once he sets up the custom domain, for the world it looks like my service is running on his machine. Many services like blogger, wp.com, tumblr give this feature.

how do i do that? I am using java to write my web app. How do i map domain name to userid when request comes in?

like image 559
Thejesh GN Avatar asked Jun 10 '09 14:06

Thejesh GN


2 Answers

How do i map domain name to userid when request comes in?

Obviously, you'll have to store that information somewhere, most likely in a database.

  1. Add a database table domains with columns:

    • customerId
    • name
    • active (1 or NULL)
    • challenge

    Add unique key for (name, active) to ensure a domain name is mapped only once.

  2. When a customer attempts to add a domain, add a row with active=NULL and challenge set to a random string.

    Show the random string to the customer and ask them to put up a web page with it on the site or create a dummy DNS record with it to verify domain ownership (this is how Google Apps do it).

    You could verify ownership by sending an email to the administrative contact or in some other way.

  3. When the customer says he did what you instructed them to do in step #2, verify it and set active=1, challenge=NULL.

    If the domain was previously active for some other customer, delete those records or set active=0.

  4. Ask the customer to add a CNAME record for their domain and forward it to your domain, e.g. hosted.myservice.com (Google uses ghs.google.com for Google Apps).

  5. When a request comes in, do

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

A better way may be to automatically offer your customers a domain in the format of <customername>.myservice.com, in addition to custom domains. This gives you two benefits:

  • Customers who don't wan't to use their own domain can still customize their login page, e.g. with a company logo.

  • For custom domains, you can ask your customer to forward them to <customername>.myservice.com instead of to a generic hosted.myservice.com.

    This enables you to horizontally partition customers among multiple servers without having to ask customers to change anything on their end. For example, you could give customers an option to choose whether they want their account hosted in EU or US. When they change it, just transfer their data and update <customername>.myservice.com. Their custom domain will work automatically.

To do this, you'd have to set up a wildcard DNS record for *.myservice.com (unless you also need the latter feature, in which case you'll have to manage individual records).

like image 74
Jaka Jančar Avatar answered Nov 02 '22 23:11

Jaka Jančar


One solution you could use is setting up a WildCard DNS Record for your application, and have the application itself check the RequestURI to see what host name the users are coming in on.

I know this is a very vague answer, but it sounds like having the WildCard record set up, with a single function checking the hostname is your best bet. This way, you do not have to set up a DNS record every time a customer signs up, and you have more time to yourself to do other things... like adding new features to your application!

like image 29
EstelS Avatar answered Nov 02 '22 23:11

EstelS