我在我的网站上使用asp.net 4,c#和Routing。
我的路线结果如
A) http://mysite.com/article/58/mytitle (result my article all is fine)
58
和mytitle
代表我的Id
表的数据库中的Title
和Articles
列。
我注意到......如果我要求:
http://mysite.com/article/2000000000/mytitle (a not existing ID)
我收到错误页面。
如果我尝试:
B) http://mysite.com/article/58/mytitttttttle (title misspelled)
我仍然可以访问我的页面http://mysite.com/article/58/mytitle
如果ID或TITLE都不代表我的DataSource中的任何记录,我需要将我的网站重定向到404页面。
PS:我注意到SO网站有类似的行为,除非他们能够在问题的ID不匹配时重定向到404页面。
我的问题:
我问,因为我对这个场景感到担忧,让我们想象一个网站链接错误地到我的网站
http://mysite.com/article/58/mytitttttttle (title misspelled)
或
http://mysite.com/article/58/mytitttttttle2222 (title misspelled)
两者都会将我的搜索引擎编入索引并导致重复内容(并且效果不佳)。
如果可能,请提供代码示例。感谢您对此的评论,谢谢!
答案 0 :(得分:1)
您好我最近这样做并使用了这个帮助很多的博客
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
答案 1 :(得分:1)
发生这种情况的原因是因为它使用数字id作为搜索关键字(在这种情况下,它无论如何都会查找第58条)。
你可以做的是
通过仅使用文本,您可以获得更清晰的网址。但是,您必须依赖数据库索引字符串,以便在postslug上进行高性能查找。你必须担心重复的slu ..
通过使用混合,你有更少的干净网址(额外的信息),但你不必太担心整数查找性能。
您选择哪种选择,在控制器中验证此信息,然后返回View,或返回HttpNotFound()
答案 2 :(得分:0)
我建议将标题保存为数据库中的唯一值,而不是传递ID和标题,这样您就可以:
如果有两个标题会怎样?好吧,那么你可以创建一个循环,直到你找到一个在末尾递增整数的唯一一个,如:
这解决了他们是一个无限数量的可能网址的问题,这些网址都指向同一个网页(Google会讨厌你)
或者,如果您希望保留包含ID和标题的URL,则在Web表单上运行if语句,该语句返回数据库中有多少记录与变量匹配。
类似的东西:
cmd.CommandText = "SELECT COUNT(*) FROM Table WHERE ID=@ID AND Title=@Title"
if ((int)cmd.executescalar == 0){
Response.Redirect("404.aspx");
}