Ben Lesh
Ben Lesh

Reputation: 108491

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

I'm getting myself acquainted with ASP.Net-MVC, and I was trying to accomplish some common tasks I've accomplished in the past with webforms and other functionality. On of the most common tasks I need to do is create SEO-friendly urls, which in the past has meant doing some url rewriting to build the querystring into the directory path.

for example: www.somesite.com/productid/1234/widget

rather than: www.somesite.com?productid=1234&name=widget

What method do I use to accomplish this in ASP.Net-MVC?

I've search around, and all I've found is this, which either I'm not understanding properly, or doesn't really answer my question:

SEO URLs with ASP.NET MVC

Upvotes: 6

Views: 5481

Answers (6)

Pouriya Ghasemi
Pouriya Ghasemi

Reputation: 44

i think stackoverflow is best practice. because when you remove a word at end of url, it redirect with 301 status to current url.

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

it had some benefits:

  1. when you change slug of page it will redirect to correct url
  2. your url is short but have seo friendly words at end.
  3. in backend you use id to find product but you have slug for search engine
  4. you can have same slug for different page. I now its not good for seo but you can have same slug for 2 products

the code will be like @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
     );

in action controller you should check database slug of product with the parameter that you receive. if they are not same redirect with status 301 to correct url. the code for redirect:

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

RedirectToActionPermanent redirect with status 301. when you do this, the search engine find that this url is changed to what you redirected.

Upvotes: 0

mynameiscoffey
mynameiscoffey

Reputation: 15982

Be careful when implementing routes with names in them, you need to validate that the name coming in is correct or you can end up harming your SEO-Ranking on the page by having multiple URIs share the same content, either set up a proper canonical or have your controller issue 301s when visiting the 'wrong' URI.

A quick writeup I did on the latter solution can be found at:
http://mynameiscoffey.com/2010/12/19/seo-friendly-urls-in-asp-net-mvc/

Some info on canonicals:
http://googlewebmastercentral.blogspot.com/2009/02/specify-your-canonical.html

Upvotes: 3

Gavin
Gavin

Reputation: 1233

It is also important to handle legacy urls. I have a database of old and new urls and I redirect with the following code;

    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
}

hope this is useful

Upvotes: 1

Martin
Martin

Reputation: 11041

Create a new route in the Global.asax to handle this:

        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 has routing built in, so no need for the Url Rewriter.

Upvotes: 7

Nathan Fisher
Nathan Fisher

Reputation: 7941

I think what you are after is MVC Routing have a look at these

Upvotes: 2

Tom Kidd
Tom Kidd

Reputation: 12908

MVC stands for "Model View Controller" and while those concepts aren't what you're asking about, you generally can wire up URL's like you see above quite easily

So for example by default the URL's look like the following

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

where controller refers to the controller class within your project, and view refers to the page/method combination within the controller. So for example you could write the view to take in an input and look something like the following

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

Now as for SEO Friendly URL's, that's just useless sugar. You author your controller such that it adds harmless cruft to the end of the URL.

So for example, you'll notice that the following three ways to get to this question produce the same result:

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 has authored their route values such that the bit that occurs after the question ID isn't really necessary to have.

So why have it there? To increase Google PageRank. Google PageRank relies on many things, the sum total of which are secret, but one of the things people have noticed is that, all other things being equal, descriptive text URL's rank higher. So that's why Stack Overflow uses that text after the question number.

Upvotes: 10

Related Questions