2015-04-10 2 views
0

У меня есть следующая конфигурация веб-сайты в IIS:Неправильного перенаправления из приложения ASP.NET MVC под URL Rewrite

  • http://main.domain.com сайт (ASP.NET MVC 5 приложений, веб-сайте привязываться к определенному хосту, порт 80)
  • сайта по умолчанию переплетено до: 80 с модулем ARR/URL Rewrite включен

Подстановочными связываниями *.domain.com задаются в настройках DNS.

Желаемое поведение, чтобы иметь http://main.domain.com в качестве точки входа и набор динамических пользовательских подобластей как http://user1.domain.com, http://user2.domain.com и т.д.

Теперь это поведение моделируется с помощью ссылки, как http://main.domain.com/user/user1

Я установил вверх по правилу перезаписи URL для main.domain.com в пути, как это:

<rule name="user-redirection" enabled="true" stopProcessing="true"> 
    <match url="^.*$" /> 
    <conditions logicalGrouping="MatchAll" trackAllCaptures="true"> 
    <add input="{HTTP_HOST}" pattern="^([\w\d-]+)\.domain\.com$" /> 
    </conditions> 
    <action type="Rewrite" url="http://main.domain.com/user/{C:1}/{R:0}" logRewrittenUrl="true" /> 
</rule> 

Все нормально здесь - я могу видеть, что http://user1.domain.com работает так же, как http://main.domain.com/user/user1, поскольку он работал раньше.

Затем я пытаюсь выполнить повторную реализацию логики проверки существования указанного пользователя в базе данных. Например, когда user47 не существует - открытие ссылки http://main.domain.com/user/user47 приводит к перенаправлению на точку входа http://main.domain.com.

В кодовой части это делается путем добавления специального атрибута фильтра к действию контроллера, который реализует необходимую условную переадресацию. У меня есть следующий код:

public class UserController : Controller { 
    [CustomRedirectBehavior] 
    public ActionResult Index() 
    { 
     ... 
    } 
} 

public class CustomRedirectBehaviorAttribute : ActionFilterAttribute { 
    public override void OnActionExecuting(ActionExecutingContext filterContext) 
    { 
     base.OnActionExecuting(filterContext); 

     ... 

     if (redirectingCondition) { 
      filterContext.Result = new RedirectResult("http://main.domain.com"); 
     } 
    } 
} 

И здесь .... Я получаю ошибку циклического перенаправления в браузере! Для того, чтобы быть уверенным, - у меня есть двойное проверил это поведение:

  1. Когда я открываю http://main.domain.com/user/user47 Я правильно перенаправлен http://main.domain.com
  2. Когда я открываю http://user47.domain.com/ я получаю циклическую ошибку перенаправления.

Тогда для того, чтобы исследовать эту проблему я модифицировал редирект обратного вызова:

filterContext.Result = new RedirectResult("http://someotherdomain.com/some/other/path"); 

И .... я могу видеть, что:

  1. Когда я открываю http://main.domain.com/user/user47 I» m правильно перенаправляется на http://someotherdomain.com/some/other/path
  2. Когда я открываю http://user47.domain.com/ Я перенаправлен на http://user47.domain.com/some/other/path !!! (И да, это не опечатка, и я также дважды проверял это поведение)

So. Мне нужна идея о том, как пройти эту проблему.

ответ

0

Ну ... Наконец-то я получил ответ.

Проблема заключалась в том, что модуль Application Request Routing (ARR) был установлен, чтобы выполнить переписывание работы с пользовательскими субдоменами.

Reverse переписывают хост в заголовках ответа опция была установлена ​​истина по умолчанию после включения прокси-сервера в области сервера Настройки прокси-сервера. Отключение этого параметра делает переадресацию правильной работы при переопределении поддоменов.

1

Я попытался воспроизвести ваш случай, и кажется, что вы действительно получаете цикл перенаправления.Поэтому я добавил в шаблон негативную группу взглядов ((?!main)), и она работает для меня. Это как моя web.config выглядит:

<rule name="user-redirection" enabled="true" stopProcessing="true"> 
    <match url="^.*$" /> 
    <conditions logicalGrouping="MatchAll" trackAllCaptures="true"> 
     <add input="{HTTP_HOST}" pattern="^(?!main)([\w\d-]+)\.domain\.com$" /> 
    </conditions> 
    <action type="Rewrite" url="http://main.domain.com/user/{C:1}" logRewrittenUrl="true" /> 
</rule> 

Для того, чтобы исследовать вашу проблему, я попробовал:

  1. Отключить кэш браузера. Если ваш браузер использует кеш, возможно, вы не увидите изменений в правиле, которое вы сделали.
  2. Измените тип действия «Переадресация» вместо «Переписать» и посмотрите, что происходит на вкладке «Сеть» в «Инструментах разработчика (F12)». , например. <action type="Redirect" ...
+0

Отличный ответ. Необходимо некоторое время, чтобы проверить, помогает ли это. Есть ли у вас какие-либо идеи, почему я получаю 'http: // user47.domain.com/some/other/path' в качестве целевого URL в последнем указанном случае? –

+1

Я пробовал несколько раз, и это работает для меня. Вы можете видеть, что на самом деле делает RedirectResult для вас [здесь] (https://github.com/aspnet/Mvc/blob/db728cd3866ed5054367fd479259441d4a72cef4/src/Microsoft.AspNet.Mvc.Core/ActionResults/RedirectResult.cs). Также вы можете попробовать сделать это вручную, используя [System.Web.HttpContext.Current.Response.Redirect («http://domain.com»)] (https://msdn.microsoft.com/en-us/library /t9dwyts4(v=vs.110).aspx). Какую версию asp.net mvc вы используете? Есть ли у вас другие переадресации/перезаписи? У вас есть какой-нибудь фрагмент кода, который очищает заголовки «перенаправлять» от ответа? –

+0

Спасибо за вашу большую помощь. Я только что нашел ответ, который разместил его ниже. –