0

我为我的网站使用 asp.net 4、c# 和 Routing。

我的路线结果像

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

58并在我的表的数据库中mytitle表示IdTitleArticles

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

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 不代表我的数据源中的任何记录,我需要将我的网站重定向到 404 页面。

PS:我注意到 SO 网站有类似的行为,除了如果问题的 ID 不匹配,他们能够重定向到 404 页面。

我的问题:

  • 这是正常行为吗?
  • 如何重定向到 404 页面?
  • 如果不可能使用 404 页面会使用规范的 url吗?

我问是因为我担心这种情况,让我们想象一个网站错误地链接到我的网站,比如

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

或者

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

两者都将成为我的搜索引擎的索引并导致重复的内容(这并不好)。

如果可能的话,请给我一个代码示例。感谢您对此的评论,谢谢!

4

3 回答 3

1

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

你可以做的是

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

通过仅使用文本,您可以获得更清晰的 url。但是,您必须依靠数据库索引您的字符串才能对您的 postslug 进行高性能查找。而且您必须担心重复的蛞蝓。

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

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

于 2011-09-23T14:19:41.763 回答
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

于 2011-09-23T14:18:03.960 回答
0

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

http://mysite.com/article/title

如果有两个标题会发生什么?好吧,然后您可以创建一个循环,直到找到一个唯一的循环,最后增加一个整数,例如:

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

这解决了它们是无限数量的可能 URL 的问题,这些 URL 都指向同一个页面(谷歌会讨厌你)


或者,如果您希望保留带有 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");
}
于 2011-09-23T14:09:43.353 回答