【问题标题】:Friendly Url Redirection友好的 URL 重定向
【发布时间】:2012-11-20 04:41:58
【问题描述】:

我有 asp.net MVC 4 网站,文章 url 是: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

(注意添加的-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; }
}

【问题讨论】:

  • 您的路由是如何设置的?
  • 更新了路由设置

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


【解决方案1】:

我最终使用了“RedirectToRoute”,同时将从数据库获取的数据存储在会话对象中。

请求流程:

  1. url 中只有 id 的请求。
  2. 从数据库中获取页面内容。
  3. 将获取的页面保存在以其 id 命名的会话对象中(例如“article-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 });
            }
        }
    

【讨论】:

    【解决方案2】:

    这个答案不是解决你的问题,而是换个角度看:

    您不能在没有重定向的情况下修改浏览器中的地址。

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

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

    为确保搜索引擎只使用一份副本,您还应该放置规范网址:

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

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

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        猜你喜欢
        • 2012-12-07
        • 2019-08-01
        • 2014-02-24
        • 2018-04-28
        • 2012-05-22
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多