【问题标题】:How do I create SEO-Friendly urls in ASP.Net-MVC如何在 ASP.Net-MVC 中创建对 SEO 友好的 URL
【发布时间】:2009-08-25 02:02:25
【问题描述】:

我正在熟悉 ASP.Net-MVC,并且我正在尝试完成一些我过去使用 web 表单和其他功能完成的常见任务。我需要做的最常见的任务之一是创建对 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

【问题讨论】:

    标签: asp.net-mvc


    【解决方案1】:

    MVC 代表“模型视图控制器”,虽然这些概念不是您要问的,但您通常可以很容易地连接上图所示的 URL

    例如,默认情况下,URL 如下所示

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

    其中控制器是指项目中的控制器类,视图是指控制器中的页面/方法组合。因此,例如,您可以编写视图以接收输入,并如下所示

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

    现在对于 SEO 友好 URL,那只是无用的糖。您编写控制器,使其在 URL 的末尾添加无害的内容。

    因此,例如,您会注意到以下三种解决此问题的方法会产生相同的结果:

    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。 Google PageRank 依赖于很多东西,其中总和是秘密的,但人们注意到的一件事是,在所有其他条件相同的情况下,描述性文本 URL 的排名更高。这就是 Stack Overflow 在问题编号后使用该文本的原因。

    【讨论】:

      【解决方案2】:

      在 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。

      【讨论】:

        【解决方案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

        【讨论】:

          【解决方案4】:

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

          【讨论】:

            【解决方案5】:

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

                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
            }
            

            希望对你有用

            【讨论】:

              【解决方案6】:

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

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

              它有一些好处:

              1. 当您更改页面的 slug 时,它将重定向到正确的 url
              2. 您的网址很短,但末尾有 seo 友好的字词。
              3. 在后端,您使用 id 查找产品,但您有搜索引擎的 slug
              4. 您可以为不同的页面使用相同的 slug。我现在对 seo 不利,但您可以为 2 种产品使用相同的 slug

              代码就像@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
                   );
              

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

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

              RedirectToActionPermanent 重定向,状态为 301。当您执行此操作时,搜索引擎会发现此 url 已更改为您重定向的内容。

              【讨论】:

                猜你喜欢
                • 2013-02-14
                • 1970-01-01
                • 2011-04-06
                • 2010-09-18
                • 1970-01-01
                • 1970-01-01
                • 2010-12-27
                • 2014-07-14
                相关资源
                最近更新 更多