开发者

Routing - Explanation for 404 page

I use asp.net 4, c# and Routing for my web site.

My Route result like

A) http://mysite.com/article/58/mytitle   (result my article all is fine)

58 and mytitle repres开发者_StackOverflowent in Id and Title Column in DataBase for my Articles table.

I notice that... if I request:

http://mysite.com/article/2000000000/mytitle (a not existing ID)

I receive an Error page.

If instead I try:

B) http://mysite.com/article/58/mytitttttttle (title misspelled)

I still get my page http://mysite.com/article/58/mytitle

I would need to have my website redirect to a 404 page if both the ID or the TITLE do not not represent any record in my DataSource.

PS: I notice that SO website has a similar behavior, apart that they are able to redirect to a 404 page if the ID for a questions does not match.

My questions:

  • is this a normal behavior?
  • how to redirect to 404 pages instead?
  • if is not possible to use 404 pages would make use canonical urls?

I asked because I'm concerning on this scenario, lets imagine a website link wrongly to my site like

http://mysite.com/article/58/mytitttttttle (title misspelled)

or

http://mysite.com/article/58/mytitttttttle2222 (title misspelled)

both will be index my Search Engine and resulting in duplicate content (and it is not good).

Please provide me a sample of code if possible. I appreciate your comment on this, thanks!


The reason this happens is because it uses the numerical id as the search key (in this case it looks for post 58 no matter what).

What you could do is either

  • get rid of numerical id, and stick with just text OR
  • retrieve the post, and verify the "postslug" is correct based on what you pulled out from database.

By using just text, you get a cleaner url. However you have to rely on your database indexing your strings in order to have high performance lookup on your postslug. And you have to worry about duplicate slugs.

By using the hybrid, you have less clean url (extra info), but you don't need to worry too much about integer lookup performance.

Which ever choice you pick, you verify this information in your controller, then either return View, or return HttpNotFound()


Hi I did this recently and used this blog which helped alot

http://weblogs.asp.net/paxer/archive/2010/05/31/asp-net-http-404-and-seo.aspx

http://searchengineland.com/url-rewriting-custom-error-pages-in-aspnet-20-12234


Rather than passing the ID and Title, I would recommend saving the Title as a unique value in the database so you can just have:

http://mysite.com/article/title

What happens if there are two titles? Well, then you can create a loop until you find a unique one incrementing an integer at the end like:

http://mysite.com/article/title-2

This gets around the issue of their being an ~infinite number of possible URLs which all point to the same page (which Google will hate you for)


Alternatively, if you wish to keep your URL with both the ID and Title in place, then on your web form run an if statement which returns how many records in the database match the variables.

Something like:

cmd.CommandText = "SELECT COUNT(*) FROM Table WHERE ID=@ID AND Title=@Title"

if ((int)cmd.executescalar == 0){
   Response.Redirect("404.aspx");
}
0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜