4

我正在用 MVC 4 编写一个网站,并且想部分复制 Stack Exchange 的路由问题样式。例如:

stackoverflow.com/questions/15191392
stackoverflow.com/questions/15191392/not-the-real-title
stackoverflow.com/questions/15191392/can-i-avoid-this-redirect-to-fix-or-add-蛞蝓

所有路由到相同的问题并更正 URL。我希望 slug 始终存在且正确,即使路由不需要它。

这是我目前的实现:

routes.MapRoute("Item", "{id}/{slug}/{action}",
                new {controller = "Item", action = "Index", slug = UrlParameter.Optional},
                new { id = @"\d+", slug = @"(?-i)[-a-z]*", action = @"(?-i)(|[A-Z][a-zA-Z]*)" });
routes.MapRoute("Default", "{controller}/{action}/{id}",
                new {controller = "Home", action = "Index", id = UrlParameter.Optional});

ItemController.cs

public ActionResult Index(int id, string slug = null)
{
    var item = GetItem(id);
    var itemSlug = ToSlug(item.Title);
    if (slug != itemSlug)
    {
        return RedirectToActionPermanent("Index", new {id, slug = itemSlug});
    }
    return View(item);
}

如果 slug 错误/丢失,我关心的是重定向。此实现可能需要两倍于解析视图所需的工作量(通过 ID 查询项目并 slug-ify 标题)。更糟糕的是,我需要为每个操作复制重定向代码。

关于代码重复、性能和 SEO 影响,我可以使用更好的实现吗?

4

1 回答 1

0

只需为您的页面实现 rel="canonical" 标记...无论如何这都很好,因为默认情况下,谷歌将您的普通域和 www 版本视为 2 个不同的站点,但它会在这里为您提供帮助,因为谷歌会理解您可能显示的所有重复项实际上是一个规范版本的所有副本(我会使用漂亮的 slug 格式),并且任何建立到任何副本的链接都将被记入正确的漂亮 url,这将是它们在搜索结果中显示的那些页面

您可以在此处阅读有关该标记及其实施的更多信息:http: //support.google.com/webmasters/bin/answer.py ?hl=en&answer=139394

于 2013-04-10T19:13:45.090 回答