У меня есть следующая конфигурация веб-сайты в 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");
}
}
}
И здесь .... Я получаю ошибку циклического перенаправления в браузере! Для того, чтобы быть уверенным, - у меня есть двойное проверил это поведение:
- Когда я открываю
http://main.domain.com/user/user47
Я правильно перенаправленhttp://main.domain.com
- Когда я открываю
http://user47.domain.com/
я получаю циклическую ошибку перенаправления.
Тогда для того, чтобы исследовать эту проблему я модифицировал редирект обратного вызова:
filterContext.Result = new RedirectResult("http://someotherdomain.com/some/other/path");
И .... я могу видеть, что:
- Когда я открываю
http://main.domain.com/user/user47
I» m правильно перенаправляется наhttp://someotherdomain.com/some/other/path
- Когда я открываю
http://user47.domain.com/
Я перенаправлен наhttp://user47.domain.com/some/other/path
!!! (И да, это не опечатка, и я также дважды проверял это поведение)
So. Мне нужна идея о том, как пройти эту проблему.
Отличный ответ. Необходимо некоторое время, чтобы проверить, помогает ли это. Есть ли у вас какие-либо идеи, почему я получаю 'http: // user47.domain.com/some/other/path' в качестве целевого URL в последнем указанном случае? –
Я пробовал несколько раз, и это работает для меня. Вы можете видеть, что на самом деле делает 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 вы используете? Есть ли у вас другие переадресации/перезаписи? У вас есть какой-нибудь фрагмент кода, который очищает заголовки «перенаправлять» от ответа? –
Спасибо за вашу большую помощь. Я только что нашел ответ, который разместил его ниже. –