友好的网址重定向

时间:2012-12-02 16:03:43

标签: c# asp.net-mvc friendly-url

我有asp.net MVC 4网站,文章网址是:www.site.com/article/623/friendly-url-here

如果有人在没有友好网址的情况下访问文章,我不会这样做 它将完成,无需重定向和访问数据库两次(这会使页面加载速度变慢)。

立即

进入www.site.com/article/623 - >进入www.site.com/article/623

正如我所希望的那样:

进入www.site.com/article/623/the-article-nice-url

(注意添加的文章 - 漂亮的网址)

更新:

在RouteConfig中使用路由:

// Articles
routes.MapRoute(
    name: "Articles",
    url: "articles/{articleId}/{friendlyUrl}",
    defaults: new { controller = "PageManagement", action = "ViewArticle", articleId = UrlParameter.Optional, friendlyUrl = UrlParameter.Optional }
);

routes.MapRoute(
    name: "Default",
    url: "{controller}/{action}/{id}",
    defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
);

我用来存储DbContext数据的页面元数据:

public class PageMetadata
{
    [Key]
    public int Id { get; set; }

    public string RepresentationString { get; set; }

    public DateTime CreationDate { get; set; }

    public DateTime LastUpdateDate { get; set; }

    public bool IsVisible { get; set; }

    public string Title { get; set; }

    public string Content { get; set; }

    public string Link { get; set; }
}

3 个答案:

答案 0 :(得分:0)

我最终使用了#34; RedirectToRoute"同时将从DB中提取的数据存储在会话对象中。

请求流程:

  1. 请求仅在网址中包含ID。
  2. 从数据库中提取页面内容。
  3. 将获取的页面保存在以其id命名的会话对象中("文章-53"例如)并重定向到正确的路径。
  4. 从会话对象中获取页面数据(如果存在)并清理会话对象。

    public ActionResult ViewArticle(int?articleId,string friendlyUrl)         {             if(articleId == null)             {                 return RedirectToActionPermanent(" Index"," Home");             }

            if (Session[string.Format("article-{0}", articleId)] != null)
            {
                PageMetadata desiredPage = (PageMetadata)Session[string.Format("article-{0}", articleId)];
                Session[string.Format("article-{0}", articleId)] = null;
                return View(desiredPage);
            }
    
            var page = context.PageMetadatas.FirstOrDefault(p => p.Id == articleId);
    
            if (page == null)
            {
                return RedirectToActionPermanent("Index", "Home");
            }
    
            if (friendlyUrl != null)
            {
                // Redirect to proper name
                if (friendlyUrl != page.RepresentationString)
                {
                    Session[string.Format("article-{0}", page.Id)] = page;
                    return RedirectToRoute("Articles", new { controller = "PageManagement", action = "ViewArticle", articleId = articleId, friendlyUrl = page.RepresentationString });
                }
                return View(page);
            }
            else
            {
                Session[string.Format("article-{0}", page.Id)] = page;
                return RedirectToRoute("Articles", new { controller = "PageManagement", action = "ViewArticle", articleId = articleId, friendlyUrl = page.RepresentationString });
            }
        }
    

答案 1 :(得分:0)

这个答案并不能解决你的问题,而是从不同的角度来看:

您无法在不重定向的情况下修改浏览器中的地址。

您应该确定,您只向用户公开了一个版本的链接。第二个将重定向,并没有任何错误,特别是当只有一种类型暴露。

这个问题的地址就是一个很好的例子。如果您转到http://stackoverflow.com/questions/13671002,您将被重定向到http://stackoverflow.com/questions/13671002/friendly-url-redirection

为确保搜索引擎只使用一个副本,您还应该放置canoncal url:

<link rel="canonical" href="http://stackoverflow.com/questions/13671002/friendly-url-redirection">

SEO不友好的地址应该以任何形式暴露。如果你没有公开它,你就不会有双重数据库查询。

答案 2 :(得分:0)

您需要使用Url重写来实现此目的。您可以选择各种技术,具体取决于您希望处理将文章ID映射到友好URL的方式。查看此文章,了解可用选项的摘要:http://weblogs.asp.net/scottgu/archive/2007/02/26/tip-trick-url-rewriting-with-asp-net.aspx