我可以避免这种永久重定向来修复或添加 slug 吗?
Posted
技术标签:
【中文标题】我可以避免这种永久重定向来修复或添加 slug 吗?【英文标题】:Can I avoid this permanent redirect to fix or add a slug? 【发布时间】:2013-02-17 22:35:07 【问题描述】:我正在用 MVC 4 编写一个网站,并且想部分复制 Stack Exchange 的路由问题样式。例如:
***.com/questions/15191392 和***.com/questions/15191392/not-the-real-title 和***.com/questions/15191392/can-i-avoid-this-redirect-to-fix-or-add-a-slug
所有路由到相同的问题并更正 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 影响方面,我可以使用更好的实现吗?
【问题讨论】:
您应该将 slug 存储在数据库中,因为如果标题更改,您希望 URL 保持不变。此外,ToSlug 可能会改变。 @usr,显然我没有仔细阅读。我假设 slug 在数据库中。 @usr 为什么我希望 slug 保持不变?蛞蝓的意义不是信息吗?旧 URL 仍然有效,但会永久重定向到带有新 slug 的 URL。 出于 SEO 原因,并且因为 URL 应该识别资源而不是更改。您不希望同一个对象有多个 URL(尽管它有效)。我认为 URL 是主键。 我在 SEO 方面做了很多工作。就像数百小时一样。如果 URL 发生了变化,你至少失去了谷歌的重新调整。并且您经常在可能的 URL 范围之间拆分 Google 果汁。理想情况下,您需要一个机器人只能看到 1 个 URL 的解决方案。 【参考方案1】:只需为您的页面实现 rel="canonical" 标记...无论如何这都很好,因为默认情况下,谷歌将您的普通域和 www 版本视为 2 个不同的站点,但它会在这里为您提供帮助,因为谷歌会理解所有重复项您可能显示的实际上是一个规范版本的所有副本(我会使用漂亮的 slug 格式),并且构建到任何副本的任何链接都将被记入正确的漂亮 url,这将是它们显示的那些搜索结果页面
您可以在此处阅读有关标签及其实现的更多信息: http://support.google.com/webmasters/bin/answer.py?hl=en&answer=139394
【讨论】:
以上是关于我可以避免这种永久重定向来修复或添加 slug 吗?的主要内容,如果未能解决你的问题,请参考以下文章