Как мне перенаправить 301 / Home в корень? - PullRequest
2 голосов
/ 22 февраля 2011

Вот мой маршрут в Global.asax для удаления / Home:

    routes.MapRoute("Root", "{action}/{id}",
        new { controller = "Home", action = "Index", id = UrlParameter.Optional }
   );

Что ж, мне нужно настроить перенаправление 301, потому что кто-то связался с / Home, и он получает 404.

Так как мне настроить 301?

Я проверил способ настройки маршрута и искал метод действия «Домой» в контроллере «Домой».

Очевидно, я мог бы добавить:

public ActionResult Home() {
    Response.Status = "301 Moved Permanently";
    Response.RedirectLocation = "/";
    Response.End();
    return Redirect("~/");
}

Однако, должен быть лучший способ сделать это правильно?

1 Ответ

8 голосов
/ 22 февраля 2011

Если вы хотите разрешить этот URL, вы можете сделать

routes.MapRoute("Root", "Home",
     new { controller = "Home", action = "Index", id = UrlParameter.Optional });

Но вы хотите перенаправления, и это имеет смысл, так что ...

Еще одна вещь, которую вы можете сделатьэто создать еще один контроллер Redirector и действие Home.

public class RedirectorController : Controller
{
    public ActionResult Home()
    {
        return RedirectPermanent("~/");
    }
}

Затем вы устанавливаете маршруты следующим образом:

routes.MapRoute("Root", "Home",
        new { controller = "Redirector", action = "Home"});

Не забудьте добавить маршрут в начало ваших маршрутов, чтобы общиймаршруты не совпадают.

Обновление:

Еще одна вещь, которую вы можете сделать, добавить это в конец ваших маршрутов:

routes.MapRoute("Root", "{controller}",
    new { controller = "Home", action = "Index", id = UrlParameter.Optional });

Но это еще не редирект.Таким образом, можно изменить перенаправитель на общий: ...

public class RedirectorController : Controller
{
    public ActionResult Redirect(string controllerName, string actionName)
    {
        return RedirectToActionPermanent(actionName, controllerName);
    }
}

Тогда маршрут (который должен быть теперь в нижней части всех маршрутов) будет:

routes.MapRoute("Root", "{controllerName}",
        new { controller = "Redirector", action = "Redirect", 
              controllerName = "Home", actionName = "Index" });

Так, он попытается перенаправить на действие Index контроллера с тем же именем, что и / name.Очевидным ограничением является название действия и передаваемые параметры.Вы можете начать строить поверх него.

...