Маршрутизация URL через несколько поддоменов - PullRequest
0 голосов
/ 14 июля 2010

Я нахожусь в сложной ситуации.Мы работаем над приложением ASP.NET MVC 2, которое состоит из нескольких разделов.Задача разработки состоит в том, чтобы эти разделы охватывали несколько поддоменов.Каждый поддомен будет иметь свой собственный контроллер.

Сложность заключается в том, что панель управления нашего хостинг-провайдера допускает две формы перенаправления для поддоменов, и ни один из них, похоже, не отвечает требованиям.Доступны следующие варианты:

  • Перенаправление на URL.Дается выбор, следует ли перенаправить на конкретный пункт назначения или пункт назначения относительно URL-адреса запроса.

  • Перенаправление на определенную папку в моем хостинговом пространстве.

Я попытаюсь проиллюстрировать предполагаемое поведение.Предполагая, что маршрут по умолчанию - {controller}/{action}/{id}, я бы хотел, чтобы URL-адрес http://subdomain.welcome.com/a/b обрабатывался приложением MVC, например http://welcome.com/subdomain/a/b.

Перенаправление URL-адреса может решить эту проблему, за исключением того факта, что пользовательвидит изменение URL в браузере.Мы не хотим, чтобы клиент видел перенаправление.

Перенаправление в корневую папку наших приложений MVC вообще не работает.Приложение не принимает запрос, и IIS возвращает ошибку 4xx.

edit:

В интересах поиска ответа я немного упросту это.«Перенаправление на URL» не делает то, что я хочу, поэтому перенаправление в папку остается.

Если я перенаправляю поддомен в корневую папку моего приложения MVC, и IIS не получает запросы,это ограничение IIS или моего провайдера?

Ответы [ 2 ]

6 голосов
/ 14 июля 2010

Можете ли вы сделать так, чтобы заголовки хостов вашего хостинга отвечали на *.mydomain.com?То есть, может ли ваш сайт принять запрос на какой-либо поддомен вашего основного домена?Если это так, то обратитесь к этому посту о том, как обрабатывать маршрутизацию субдоменов в приложениях MVC, и вам следует хорошо.код более краткий.В любом случае, убедитесь, что у вас есть 404 ошибки для людей, пытающихся перейти на поддомены, которые не существуют.

public class ExampleRoute : RouteBase
{

    public override RouteData GetRouteData(HttpContextBase httpContext)
    {
        var url = httpContext.Request.Headers["HOST"];
        var index = url.IndexOf(".");

        if (index < 0)
            return null;

        var subDomain = url.Substring(0, index);

            var routeData = new RouteData(this, new MvcRouteHandler());
            routeData.Values.Add("controller", subdomain); //attempts to go to controller action of the subdomain
            routeData.Values.Add("action", "Index"); //Goes to the Index action on the User2Controller

            return routeData;
    }

    public override VirtualPathData GetVirtualPath(RequestContext requestContext, RouteValueDictionary values)
    {
        //Implement your formating Url formating here
        return null;
    }
}
0 голосов
/ 14 июля 2010

Не уверен, является ли это излишним (это фактически используется для обслуживания страниц из zip-файла или файла ресурсов и т. Д.), НО ... возможно, вы могли бы использовать провайдера виртуальных путей? ..

Реализуйте класс, который наследуется от VirtualPathProvider, и зарегистрируйте его в глобальном запуске следующим образом:

HostingEnvironment.RegisterVirtualPathProvider(new MyVirtualPathProvider());

Затем реализуйте класс, который наследуется от VirtualFile, и обслуживайте его из переопределения GetFile () в реализации вашего поставщика виртуального пути:

public override VirtualFile GetFile( string virtualPath )
{
 if( IsVirtualFile(virtualPath) )
    return new MyVirtualFile(virtualPath);
 return base.GetFile(virtualPath);
}

Примечание: IsVirtualFile - это функция, которую вам нужно реализовать, основываясь на ваших правилах, касающихся формата URL и т. Д.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...