【问题标题】:Routing - Explanation for 404 page路由 - 404 页面说明
【发布时间】:2011-09-23 14:06:18
【问题描述】:

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

我的路线结果喜欢

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

58mytitle 在我的 Articles 表的数据库中的 IdTitle 列中表示。

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

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 页面会使用canonical urls?

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

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

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

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

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

【问题讨论】:

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


    【解决方案1】:

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

    你可以做的是要么

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

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

    通过使用混合,您可以减少干净的 url(额外信息),但您无需过多担心整数查找性能。

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

    【讨论】:

    • 抱歉,“postslug”是什么意思?
    • “Slug”是您的 url 中的字符串的术语(文章/帖子的文本标识符等)
    • 在 WebForm 的情况下 make send 运行逻辑...在页面预 int 中?在全球 Asa 上?
    【解决方案2】:

    【讨论】:

    • 感谢 Bobby 提供的链接,特别是第一个链接真的很有帮助,我解决了另一个关于 httpheader 未找到页面的问题。
    • 干得好。我很高兴能帮上忙
    【解决方案3】:

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

    http://mysite.com/article/title

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

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

    这解决了它们是无限数量的可能 URL 都指向同一页面(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");
    }
    

    【讨论】:

    • 感谢您的评论,我担心性能。在您的第一个建议中,ID 是数据库中的主键,我想找到 Title 应该更贵。第二种是一种有趣的方法,但我需要在每个页面请求上运行 SQL,所以再次过热......还有其他想法或解决方案吗?感谢您抽出宝贵时间!
    猜你喜欢
    • 1970-01-01
    • 2019-08-02
    • 2013-01-26
    • 2017-01-19
    • 2015-01-02
    • 2016-09-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多