.net MVC属性路由,重定向旧URL
我刚刚从MVC4升级到5,并开始使用属性路由。 它工作完美,易于实现 但是,由于该网站已经开通了几个月,有很多链接到该网站,包括来自搜索引擎的链接。 旧的URL将无法工作,因此我需要永久重定向它们。 我不确定最好的办法是什么。我认为,如果我在route.config中创建了一个路由,它将作为routing属性的备份。但这似乎是唯一一个先到先得的方法 例如。。 旧网址:/bank/5 新网址:/superbank/5 属性路由如下所示:.net MVC属性路由,重定向旧URL,.net,asp.net-mvc,asp.net-mvc-5,.net,Asp.net Mvc,Asp.net Mvc 5,我刚刚从MVC4升级到5,并开始使用属性路由。 它工作完美,易于实现 但是,由于该网站已经开通了几个月,有很多链接到该网站,包括来自搜索引擎的链接。 旧的URL将无法工作,因此我需要永久重定向它们。 我不确定最好的办法是什么。我认为,如果我在route.config中创建了一个路由,它将作为routing属性的备份。但这似乎是唯一一个先到先得的方法 例如。。 旧网址:/bank/5 新网址:/superbank/5 属性路由如下所示: [Route("superbank/{id}")] 以及r
[Route("superbank/{id}")]
以及route.config:
routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
routes.LowercaseUrls = true;
routes.MapMvcAttributeRoutes();
routes.MapRoute(
"BankDetails",
"bank/{id}",
new { controller = "Home", action = "bank" }, //the action is still called bank, not superbank
new { id = @"^\d+$" }
);
使用此代码,只有superbank/5可以工作,而不是bank/5
如果我将mapmvCatTributerRoutes放在MapRoute下面,两个URL都不会工作,项目中的所有URL都将被创建并指向bank/5
有什么想法吗?
我应该使用global.asax还是IIS url rewrite?如果您只有一条带有id参数的路由要重定向,我只需要创建一个操作方法并在那里处理重定向:
[Route("bank/{id}")]
public ActionResult Bank(int id)
{
return RedirectToActionPermanent("superbank", new { id });
}
嗯。我想出了一个解决办法。它可能不是最好的,但它很有效 在RouteConfig.cs中,我添加了一个catchall路由。现在看起来是这样的:
routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
routes.LowercaseUrls = true;
routes.MapMvcAttributeRoutes();
routes.MapRoute(
"",
"{catchall*}",
new { controller = "Home", action = "NotFound" }
);
routes.MapRoute(
"BankDetails",
"bank/{id}",
new { controller = "Home", action = "bank" },
new { id = @"^\d+$" }
);
然后,我添加了一个在我的家庭控制器中找不到的操作:
public ActionResult NotFound()
{
string url = Request.Url.ToString();
url = url.Replace("/bank/", "/superbank/");
url = url.Replace("old-page-name", "new-page-name"); //Just to demonstrate
if (url != Request.Url.ToString())
return RedirectPermanent(url);
else
return Redirect("404page");
}
这个很好用。您只需小心不要替换过于通用的名称。我不想重命名该操作,也不能创建两个操作,一个使用route bank/{id},另一个使用superbank/{id}。这里不仅有一个动作,总共大约有30个动作: