2012-05-03 9 views
10

Ich möchte eine SaaS-Beispielanwendung erstellen, mit der Benutzer sich anmelden, Webseiten erstellen, Vorlagen verwenden und/oder sie mit benutzerdefiniertem CSS anpassen und ihre Webseiten bedienen können Aus benutzerdefinierten Domänen.Wie man benutzerdefinierte Domains bedient, die auf eine Subdomain in Saas App verweisen

Ich erwog, die Vorlagen auf S3/anderen CDNs zusammen mit Medien/Stylesheets/JS-Dateien zu speichern. Während alle technisch möglich sind (praktisch? Das könnte strittig sein). Wie auch immer, es fiel mir schwer herauszufinden, wie Websites in diesem Fall von benutzerdefinierten Domains bedient werden. Zum Beispiel, wenn sie sich anmelden, könnten sie eine subdomain.domain.com Adresse bekommen. Wie aber weisen sie customerdomain.com so, dass, wenn customerdomain.com eingegeben, es gleichen Inhalt wie customerdomain.domain.com dient, und URL bleibt customerdomain.com

Außerdem, wenn ich eine „feature“, wobei zu wollen, benutzerdefinierter Domains eine bezahlte Funktion sein könnte. Wie würde ich das auf bezahlte Nutzer beschränken?

Normalerweise, wenn wir Websites einrichten, spezifizieren wir sie in der virtuellen Host-Konfigurationsdatei (Apache) und geben ihr Aliase, so dass sie diese Aliase suchen und bedienen. In diesem Fall möchte ich keine separate vhost-Datei für jede Person, die sich anmeldet. Gibt es eine Alternative? Wie kann ich das programmieren? Gibt es irgendwelche Probleme zu beachten?

Eine Lösung, die ich gesehen habe, ist der Server eine Wildcard-Domain, d. H. *.domain.com, und eine separate vhost für jede benutzerdefinierte Domäne, aber ich würde lieber vermeiden, wenn ich kann.

Danke.

Antwort

6

Die benutzerdefinierte Domäne wird normalerweise über einen CNAME-DNS-Eintrag (eine Art Symlink für DNS-Einträge) erstellt. Sie teilen Ihrem Kunden (der normalerweise die Kontrolle über customerdomain.com hat) mit, einen CNAME-Datensatz zu erstellen, der besagt, dass customerdomain.com ein Alias ​​für customerdomain.domain.com ist. Dann müssen Sie Ihren eigenen Server einrichten, um Anfragen an customerdomain.com genauso zu interpretieren, wie Anfragen an customerdomain.domain.com.

Je nachdem, wie Sie Ihre Subdomains bedienen, kann dies auf verschiedene Arten erfolgen.

Wenn Sie eine vhost-Datei für jeden einzelnen Kunden haben, müssen Sie eine "ServerAlias" -Direktive für die benutzerdefinierte Domäne hinzufügen, die Ihr Client bereitgestellt hat.

Wenn Sie den Einstiegspunkt über Ihren eigenen Anwendungsserver codieren (sagen Sie den HTTP-Header "Host" von PHP lesen und dann den Kundennamen festlegen), müssen Sie diesen Code entsprechend anpassen, um Anforderungen für externe Benutzer zu interpretieren Domains gemäß Ihrer eigenen Datenbank mit benutzerdefinierten Domains. Sie können sogar gerade DNS dafür verwenden!

Etwas auf den Linien von:

if http "host" header does not end in domain.com: 
    cname = get_cname_record(http "host" header value) 
    if cname does not end in domain.com: 
     return error 404 
    else: 
     site = first part of cname 
else: 
    site = first part of http "host" header 

Dann können Sie DNS als "benutzerdefinierten Domain-Datenbank" verwenden. Stellen Sie jedoch sicher, dass Sie einen DNS-Cache verwenden, da diese Abfragen bei jeder einzelnen Anfrage ausgeführt werden.

+0

danke, Ihr psuedocode half beim Verständnis der Lösung. Über DNS-Cache, auf einem Server ist es nicht Standard? Ich meine DNS-Abfragen werden vom Betriebssystem (Ubuntu) zwischengespeichert. Muss ich etwas extra dafür tun? – Nasir

+0

Das hängt davon ab, wie Sie "get_cname_record" implementieren. Wenn Sie gethostbyaddr() oder ein Derivat (die wahrscheinlichste Option) verwenden, stellt Ihr System normalerweise bereits eine Art Caching bereit. Vergleichen Sie es jedoch, indem Sie eine Reihe von Suchvorgängen durchlaufen, damit Sie nicht in eine Falle geraten. Ich habe gesehen, dass es passiert ist, also nur ein FYI. – GomoX