Asp.net mvc 如何将301重定向/主页到根目录?

Asp.net mvc 如何将301重定向/主页到根目录?,asp.net-mvc,asp.net-mvc-routing,http-status-code-301,Asp.net Mvc,Asp.net Mvc Routing,Http Status Code 301,以下是我在Global.asax中删除/主页的路径: routes.MapRoute("Root", "{action}/{id}", new { controller = "Home", action = "Index", id = UrlParameter.Optional } ); 我需要设置301重定向,因为有人链接到了/Home,他们得到了404 那么如何设置301呢 我检查了路由设置的方式,它正在“主”控制器中寻找“主”操作方法 因此,显然我可以补充:

以下是我在Global.asax中删除/主页的路径:

    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("~/");
}

但是,必须有更好的方法来做到这一点吗?

如果您想允许此URL,您可以这样做

routes.MapRoute("Root", "Home",
     new { controller = "Home", action = "Index", id = UrlParameter.Optional });
但是你需要重定向,而且这是最有意义的,所以

您可以做的另一件事是创建另一个控制器重定向器和操作主页

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);
    }
}
然后路线(现在应位于所有路线的底部)将为:


因此,它将尝试重定向到与/name同名的控制器的索引操作。明显的限制是操作的名称和传递的参数。你可以在上面开始构建。

太有趣了,当你键入此内容时,我正在编辑我的“问题”,并提出了同样的问题。你知道为什么指向Url.Action(“索引”、“主页”)的链接现在会显示为:如果在更新中选择了最后一条路径,你确定你将其添加到了最底部吗?我已经修复了它。我还发现,只需创建一个链接,确保在controllerName变量上使用双引号,否则它将无法构建。MapRoute(“根“,”{controllerName}),新的{controller=“Redirector”,action=“Redirect”,controllerName=“Home”,actionName=“Index”});
routes.MapRoute("Root", "{controllerName}",
        new { controller = "Redirector", action = "Redirect", 
              controllerName = "Home", actionName = "Index" });