我正在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-a-slug
所有路由到同一个问题并更正网址。我希望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影响方面,我可以使用更好的实现吗?
答案 0 :(得分:-1)
只为您的网页实施rel =“canonical”标签...无论如何这是好的,因为默认情况下谷歌将您的普通域名和www版本视为2个不同的网站,但它会帮助您在这里,因为谷歌将了解所有重复项你可能显示的实际上是一个规范版本的所有副本(我会使用漂亮的slug格式),任何重复项构建的链接都将被记入正确的漂亮网址,它们将显示在搜索结果页面
您可以在此处详细了解标记及其实现: http://support.google.com/webmasters/bin/answer.py?hl=en&answer=139394