如何在ASP.Net-MVC中创建SEO友好的URL

时间:2009-08-25 02:02:25

标签: asp.net-mvc

我正熟悉ASP.Net-MVC,我试图完成我过去用webforms和其他功能完成的一些常见任务。关于我需要做的最常见的任务是创建SEO友好的URL,这在过去意味着做一些url重写以在目录路径中构建查询字符串。

例如: www.somesite.com/productid/1234/widget

而不是: www.somesite.com?productid=1234&name=widget

我在ASP.Net-MVC中使用什么方法来完成此任务?

我一直在四处寻找,而我所发现的就是这个,要么我不理解,要么没有真正回答我的问题:

SEO URLs with ASP.NET MVC

6 个答案:

答案 0 :(得分:10)

MVC代表“模型视图控制器”,虽然这些概念不是您所要求的,但您通常可以像上面看到的那样轻松连接网址

因此,例如默认情况下,URL看起来像以下

http://www.somesite.com/controller/view/

其中controller指的是项目中的控制器类,而view指的是控制器中的页面/方法组合。因此,例如,您可以编写视图以接受输入,并且看起来类似于以下

http://www.somesite.com/widget/productid/1234/

现在对于 SEO Friendly 网址来说,这只是无用的糖。您创建控制器,以便在URL的末尾添加无害的cruft。

例如,您会注意到以下三种方法可以产生相同的结果:

How do I create SEO-Friendly urls in ASP.Net-MVC

How do I create SEO-Friendly urls in ASP.Net-MVC

How do I create SEO-Friendly urls in ASP.Net-MVC

Stack Overflow已经创建了他们的路由值,使得问题ID之后的位不是真正必需的。

为什么要在那里?增加Google PageRank。谷歌PageRank依赖于许多东西,其总和是秘密的,但人们注意到的一件事是,在所有其他条件相同的情况下,描述性文本URL的排名更高。这就是Stack Overflow在问题编号后使用该文本的原因。

答案 1 :(得分:6)

在Global.asax中创建一个新路由来处理:

        routes.MapRoute(
            "productId",                  // Route name
            "productId/{id}/{name}",      // URL with parameters
            new { controller = "Home", action = "productId", id = 1234, name = widget }  // Parameter defaults
        );

Asp.Net MVC内置了路由,因此不需要Url Rewriter。

答案 2 :(得分:3)

在实现包含名称的路由时要小心,您需要验证进入的名称是否正确,或者您可以通过让多个URI共享相同的内容来最终损害页面上的SEO排名,或者设置一个正确的规范或让您的控制器在访问“错误的”URI时发出301。

我对后一种解决方案的快速写作可以在以下网址找到:
http://mynameiscoffey.com/2010/12/19/seo-friendly-urls-in-asp-net-mvc/

关于规范的一些信息:
http://googlewebmastercentral.blogspot.com/2009/02/specify-your-canonical.html

答案 3 :(得分:2)

我认为你所追求的是MVC路由 看看这些

答案 4 :(得分:1)

处理旧网址也很重要。我有一个旧网址和新网址的数据库,我使用以下代码重定向;

    public class AspxCatchHandler : IHttpHandler, IRequiresSessionState
{

    #region IHttpHandler Members

    public bool IsReusable
    {
        get { return true; }
    }

    public void ProcessRequest(HttpContext context)
    {
        if (context.Request.Url.AbsolutePath.Contains("aspx") && !context.Request.Url.AbsolutePath.ToLower().Contains("default.aspx"))
        {
            string strurl = context.Request.Url.PathAndQuery.ToString();
            string chrAction = "";
            string chrDest = "";

            try
            {

                DataTable dtRedirect = SqlFactory.Execute(
                    ConfigurationManager.ConnectionStrings["emptum"].ConnectionString,
                    "spGetRedirectAction",
                    new SqlParameter[] { 
                        new SqlParameter("@chrURL", strurl)
                    },
                    true);

                chrAction = dtRedirect.Rows[0]["chrAction"].ToString();
                chrDest = dtRedirect.Rows[0]["chrDest"].ToString();

                chrDest = context.Request.Url.Host.ToString() + "/" + chrDest;
                chrDest = "http://" + chrDest;


                if (string.IsNullOrEmpty(strurl))
                    context.Response.Redirect("~/");
            }
            catch
            {
                chrDest = "/";// context.Request.Url.Host.ToString();
            }

            context.Response.Clear();
            context.Response.Status = "301 Moved Permanently";
            context.Response.AddHeader("Location", chrDest);
            context.Response.End();

        }
        else
        {
            string originalPath = context.Request.Path;
            HttpContext.Current.RewritePath("/", false);
            IHttpHandler httpHandler = new MvcHttpHandler();
            httpHandler.ProcessRequest(HttpContext.Current);
            HttpContext.Current.RewritePath(originalPath, false);
        }
    }

    #endregion
}

希望这很有用

答案 5 :(得分:0)

我认为stackoverflow是最佳实践。 因为当您删除网址末尾的单词时,它会以301状态重定向到当前网址。

domain.com/product/{id}/{slug}

它有一些好处:

  1. 当您更改页面的内容时,它将重定向到正确的网址
  2. 您的网址很短,但末尾有seo友好词。
  3. 在后端,您使用id查找产品,但是对于搜索引擎却一无所知
  4. 您可以为不同的页面使用相同的子弹。我现在对seo不好,但是您可以为2种产品设置相同的子弹

代码将类似于@Martin

    routes.MapRoute(
    name: "Cafes",
    url: "cafe/{id}/{FriendlyUrl}",// how send array in metod get 
    defaults: new { controller = "cafe", action = "index", id = UrlParameter.Optional, FriendlyUrl = UrlParameter.Optional }//, id = UrlParameter.Optional
     );

在动作控制器中,您应该使用收到的参数检查产品的数据库信息。如果它们不相同,请使用状态301重定向以更正url。 重定向代码:

 return RedirectToActionPermanent("index", new
                    {
                        id = CafeParent.CafeID,
                        FriendlyUrl = CafeParent.CafeSlug.Trim()
                    });

RedirectToAction永久重定向,状态为301。执行此操作时,搜索引擎会发现此网址已更改为您重定向的网址。