Вопрос

Я рассматриваю возможность использования ASP.NET для новой службы SaaS, но, черт возьми, я не могу понять, как выполнять поиск учетных записей на основе поддоменов, как в большинстве приложений SaaS (например,37Сигналы) делаю.

Например, если я предлагаю yourname.mysite.com, то как мне использовать ASP.NET (в частности, MVC) для извлечения поддомена, чтобы я мог загрузить правильный шаблон (отображающий название вашей компании и тому подобное)?Можно ли это сделать с помощью обычной маршрутизации?

Кажется, это обычное дело в SaaS, поэтому в ASP.NET должен быть простой способ сделать это;Я знаю, что есть плагины, которые делают это для других фреймворков, таких как Ruby on Rails.

Это было полезно?

Решение

Это работает для меня:

    //--------------------------------------------------------------------------------------------------------------------------
    public string GetSubDomain()
    {
        string SubDomain = "";

        if (Request.Url.HostNameType == UriHostNameType.Dns)
            SubDomain = Regex.Replace(Request.Url.Host, "((.*)(\\..*){2})|(.*)", "$2");
        if (SubDomain.Length == 0)
            SubDomain = "www";
        return SubDomain;
    }

Я предполагаю, что вы хотели бы обрабатывать несколько учетных записей в одном веб-приложении, а не создавать отдельные сайты с помощью инструментов IIS.В нашей работе мы начали создавать новый веб-сайт для каждого поддомена, но обнаружили, что этот подход плохо масштабируется, особенно когда вы выпускаете обновление, а затем вам приходится изменять десятки сайтов!Таким образом, я рекомендую этот подход, а не серверно-ориентированные методы, предложенные выше, основываясь на многолетнем опыте выполнения именно того, что вы предлагаете.

Приведенный выше код просто проверяет, что это полностью сформированный URL-адрес (а, скажем, не IP-адрес) и возвращает субдомен.Это хорошо сработало для нас в условиях довольно большого объема.

Другие советы

Вы должны быть в состоянии забрать это из Серверные переменные сбор, но сначала необходимо настроить IIS и DNS для корректной работы.Итак, вы знаете, что 37Signals, вероятно, используют Apache или другой веб-сервер Unix с открытым исходным кодом.В Apache это называется Виртуальный хостинг.

Чтобы сделать это с помощью IIS, вам потребуется создать новую запись DNS (создать CNAME yourname.mysite.com для application.mysite.com) для каждого домена, который указывает на ваше приложение в IIS (application.mysite.com).

Ты тогда создать запись заголовка хоста в приложении IIS (application.mysite.com), который будет принимать заголовок yourname.mysite.com.На самом деле пользователи перейдут на application.mysite,com, но адрес является пользовательским поддоменом.Затем вы получаете доступ к коллекции ServerVariables, чтобы получить значение и решить, как настроить сайт.

Примечание:существует несколько альтернативных реализаций, которым вы можете следовать в зависимости от требований.

  • Выполните обработку заголовка хоста на аппаратном балансировщике нагрузки (скорее всего, это делает 37Signals, а не полагается на веб-сервер) и создайте собственный HTTP-заголовок для передачи веб-приложению.
  • Создайте новое веб-приложение и заголовок хоста для каждого отдельного приложения.Вероятно, это неэффективная реализация для большого числа пользователей, но для некоторых она может обеспечить лучшую изоляцию и безопасность.

Вам необходимо настроить DNS для поддержки поддоменов с подстановочными знаками.Это можно сделать, добавив запись A, указывающую на ваш IP-адрес, например:

* A 1.2.3.4

Как только это будет сделано, все, что вы наберете перед тем, как ваш домен, будет отправлено в ваш корневой домен, куда вы можете получить, разделив переменную сервера HTTP_HOST, как указано выше:

 string user = HttpContext.Request.ServerVariables["HTTP_HOST"].Split(".")

//use the user variable to query the database for specific data

ПС.Если вы используете общий хостинг, вам, вероятно, понадобится дополнение с уникальным IP-адресом, поскольку для работы доменов с подстановочными знаками обязательно.Если вы используете выделенный хостинг, у вас уже есть собственный IP.

Я сделал это с помощью HttpContext.Request.ServerVariables["HTTP_HOST"].Split(".").

Дай мне знать, если тебе еще понадобится помощь.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top