Как обслуживать пользовательские домены, указывающие на поддомен в приложении Saas

Я хочу создать пример приложения SaaS, посредством которого пользователи смогут регистрироваться, создавать веб-страницы, использовать шаблоны и/или настраивать их с помощью пользовательского css, обслуживать свои веб-страницы вне пользовательских доменов.

Я рассматривал возможность сохранения шаблонов на S3/других CDN вместе с файлами media/stylesheets/js. Хотя все технически возможно (практично, что может быть спорным). В любом случае, мне было трудно узнать, как веб-сайты будут обслуживаться с пользовательских доменов в этом случае? Например, когда они регистрируются, они могут получить адрес subdomain.domain.com. Тем не менее, как они указывают customerdomain.com, так что когда customerdomain.com вводится, он обслуживает тот же контент, что и customerdomain.domain.com, а URL остается customerdomain.com

Кроме того, если я хочу иметь "feature", в котором пользовательские домены могут быть платной функцией. Как я могу ограничить его только платными пользователями?

Обычно, когда мы настраиваем веб-сайты, мы указываем его в файле конфигурации виртуального хоста (apache) и присваиваем ему псевдонимы, поэтому он ищет и обслуживает эти псевдонимы. В этом случае я не хочу иметь отдельный файл vhost для каждого человека, который подписывается. Есть ли альтернатива? Как я могу запрограммировать это? Есть ли какие-либо проблемы, о которых нужно знать?

Одно из решений, которое я видел, заключается в том, чтобы сервер обслуживал подстановочный домен i.e *.domain.com и отдельный vhost для каждого настраиваемого домена, однако я бы предпочел избежать, если смогу.

Спасибо.

Ответ 1

Пользовательский домен обычно выполняется с помощью записи CNAME DNS (вид символической ссылки для записей DNS). Вы сообщаете своему клиенту (который обычно контролирует customerdomain.com), чтобы создать запись CNAME, в которой говорится, что customerdomain.com является псевдонимом для customerdomain.domain.com. Затем вам нужно настроить свой собственный сервер, чтобы интерпретировать запросы на customerdomain.com так же, как обрабатывать запросы на customerdomain.domain.com.

В зависимости от того, как вы обслуживаете свои поддомены, это можно сделать несколькими способами.

Если у вас есть файл vhost для каждого отдельного клиента, вам нужно добавить директиву ServerAlias ​​для настраиваемого домена, предоставленного вашим клиентом.

Если вы кодируете точку входа через свой собственный сервер приложений (скажем, читаете HTTP-заголовок "Host" из PHP и затем устанавливаете имя клиента из этого), тогда вам нужно настроить этот код для интерпретации запросов для внешних доменов согласно вашей собственной базе данных пользовательских доменов. Вы можете даже использовать прямой DNS для этого!

Что-то в строках:

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

Затем вы можете использовать DNS как свою "пользовательскую базу данных домена". Убедитесь, что вы используете кеш DNS, поскольку эти запросы будут выполняться для каждого отдельного запроса.