路由 - 404页面的说明

时间:2011-09-23 14:06:19

标签: c# asp.net routing asp.net-routing

我在我的网站上使用asp.net 4,c#和Routing。

我的路线结果如

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

58mytitle代表我的Id表的数据库中的TitleArticles列。

我注意到......如果我要求:

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页面。

我的问题:

  • 这是正常行为吗?
  • 如何重定向到404页面呢?
  • 如果无法使用404页面会使用canonical urls

我问,因为我对这个场景感到担忧,让我们想象一个网站链接错误地到我的网站

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

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

两者都会将我的搜索引擎编入索引并导致重复内容(并且效果不佳)。

如果可能,请提供代码示例。感谢您对此的评论,谢谢!

3 个答案:

答案 0 :(得分:1)

答案 1 :(得分:1)

发生这种情况的原因是因为它使用数字id作为搜索关键字(在这种情况下,它无论如何都会查找第58条)。

你可以做的是

  • 摆脱数字ID,并坚持使用文字或
  • 检索帖子,并根据您从数据库中提取的内容验证“postslug”是否正确。

通过仅使用文本,您可以获得更清晰的网址。但是,您必须依赖数据库索引字符串,以便在postslug上进行高性能查找。你必须担心重复的slu ..

通过使用混合,你有更少的干净网址(额外的信息),但你不必太担心整数查找性能。

您选择哪种选择,在控制器中验证此信息,然后返回View,或返回HttpNotFound()

答案 2 :(得分:0)

我建议将标题保存为数据库中的唯一值,而不是传递ID和标题,这样您就可以:

  

http://mysite.com/article/title

如果有两个标题会怎样?好吧,那么你可以创建一个循环,直到你找到一个在末尾递增整数的唯一一个,如:

  

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

这解决了他们是一个无限数量的可能网址的问题,这些网址都指向同一个网页(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");
}