1

我有一个 MVC 网站,它曾经使用以下标准格式的 URL:Controller/Action。

最近,我将其更改为: Site/Controller/Action.

问题是,有几个指向我网站的链接遵循旧格式,我想相应地重定向它们。

例如:mydomain.com/Home/CustomerSearch现在应该去mydomain.com/Online/Home/CustomerSearch

而:mydomain.com/AffiliatesHome/CustomerSearch现在应该去mydomain.com/Affiliate/AffiliatesHome/CustomerSearch

我怎样才能让它通过添加额外的路由来处理重定向,这取决于他们进来的链接?

我正在使用的当前路由是:

 routes.MapRoute(
      "Default", // Route name
      "{site}/{controller}/{action}/{id}",              
      new {site="IS", controller = "Home", action = "Index", id = UrlParameter.Optional }
   );
4

1 回答 1

1

由于我在您的旧 URL 映射中没有真正看到架构,我建议添加与旧 Controller/Action 架构匹配的路由并将它们映射到新的 Site/Controller/Action 路由架构。

所以你可以添加以下路线

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

routes.MapRoute(
  "LegacyAffiliates", 
  "AffiliatesHome/{action}/{id}", 
  new { site="Affiliate", controller = "AffiliatesHome", action = "Index", id = UrlParameter.Optional } 
);

从 SEO 的角度来看,这并不理想,因为同一页面有不同的 URL。通过状态码 301 和在该位置传递的新 URL 的永久重定向更适合。

您可以构建一个重定向控制器并使用旧路由将旧 URL 映射到重定向控制器,就像这样

routes.MapRoute(
           "LegacyHome",
           "Home/{newAction}/{id}",
           new { controller = "Redirect", action = "Redirect", newSite = "Online", newController="Home", newAction = "Index", id = UrlParameter.Optional }
        );

重定向控制器的代码

    public class RedirectController : Controller
{
    public ActionResult Redirect(string newSite, string newController, string newAction)
    {
        var routeValues = new RouteValueDictionary(
            new
                {
                    site = newSite,
                    controller = newController,
                    action = newAction
                });

        if (RouteData.Values["id"] != null)
        {
            routeValues.Add("id", RouteData.Values["id"]);
        }

        return RedirectToRoutePermanent(routeValues);
    }
}
于 2012-10-18T21:36:07.357 回答