【问题标题】:StackOverflow like URL Routing类似 URL 路由的 StackOverflow
【发布时间】:2011-09-11 15:24:13
【问题描述】:

据我了解,StackOverflow 中的问题格式如下

http://stackoverflow.com/questions/{question-id}/{slug-made-from-question-title}

所以基本上问题是使用 question-id 检索的。所以我给蛞蝓的任何价值都是无关紧要的。

首先我想知道这个理解是不是错了:)

我有一个网址

http://stackoverflow.com/questions/6291678/convert-input-string-to-a-clean-readable-and-browser-acceptable-route-data

然后我像这样手动更改了 slug。

http://stackoverflow.com/questions/6291678/naveen

但它变成了原来的蛞蝓。 Firebug 向我展示了更改后的 URL 上的永久重定向 301。如何实现这个功能?

【问题讨论】:

  • 有一分钟我以为这是一个元问题:-)
  • @Jodrell:对我来说,SO 本身就是一本关于如何构建网站的精彩书籍。我总是把它作为我的基准:)

标签: c# asp.net redirect http-status-code-301 url-redirection


【解决方案1】:

您可以使用自 ASP.NET 4.0 起可用的 Response.RedirectPermanent 来做到这一点:

http://msdn.microsoft.com/en-us/library/system.web.httpresponse.redirectpermanent.aspx

protected void Page_Load(object sender, EventArgs e)
{
    if(!IsPostBack)
    {
        string id = RouteData.Values["id"].ToString();
        string passedSlug = RouteData.Values["name"].ToString();
        //get the original slug from database / dymanic method
        string originalSlug = GetSlugFromID(id);

        if(!originalSlug.Equals(passedSlug))
        {
            var url = String.Format("~/test/{0}/{1}", id, originalSlug);
            Response.RedirectPermanent(url, true);
        }
    }
}

在一个不相关的旁注中,想认为 Stack Overflow 没有将 slug 保存在数据库中。它从标题using something like this 动态创建。我只是改变了我的问题的标题,并且slug改变了。没有必要将 slug 存储在数据库中,因为它对标题来说是多余的。

【讨论】:

  • +1 我对您的答案进行了一些编辑。否则我必须发布我自己的答案。希望你不介意。
  • @naveen:我欢迎编辑,它显然提供了更完整的答案。谢谢!
  • 如何在 MVC 中实现这一点?我的意思是如何在 ID 之后附加文本?我正在使用 asp.net mvc
【解决方案2】:

这是通过301 redirectpreferred canonical URL 完成的。该脚本检查请求的 URL 以查看 URL 是否与 URL 的“首选”版本匹配。如果没有,它会向浏览器发送一个 301 重定向,并告诉它该页面已永久移动到该位置。

这样做的原因很明显:没有这个,你可以构造成千上万个 URL,比如http://stackoverflow.com/questions/6291678/foohttp://stackoverflow.com/questions/6291678/barhttp://stackoverflow.com/questions/6291678/blah;都指向相同的内容。搜索引擎会因重复内容而惩罚您。

编辑

在您的 ASP.Net 应用程序中,您可以将浏览器提供的 slug 与存储在数据库中的 slug 进行比较。如果它们不匹配,则发送 301 重定向。由于涉及数据库,您可能无法通过 web.config 或其他方式执行此操作。这是我前段时间在我的博客上发布的示例代码(不确定它是否会起作用):

Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs)
    Dim myId As Integer = 1234
    Dim mySlug As String = "preferred-slug"
    If Request.Url.AbsolutePath.Equals("/" & myId & "/" & mySlug) = False Then
        Response.Clear()
        Response.Status = "301 Moved Permanently"
        Response.AddHeader("Location", "http://" & Request.Url.Host & "/" & myId & "/" & mySlug & Request.Url.Query)
        Response.End()
    End If
End Sub

我假设您已经实现了某种形式的 URL 重写,它将对 /\d+/.+ 的任何请求抛出到您的 asp.net 页面。

【讨论】:

  • 是的。我很好奇如何在 asp.net 中实现这一点:)
  • 我认为您不需要实现它,只需在 IIS 7 中配置它(如果您在 Windows Server 2008 上运行)。
  • @Roy 在检查数据库之前,您无法知道正确的 slug。所以不能在 IIS 上配置一些静态规则。
【解决方案3】:

您可以使用 IIS URL 重写ASP.NET 路由

查看这篇文章进行详细比较: http://learn.iis.net/page.aspx/496/iis-url-rewriting-and-aspnet-routing/

【讨论】:

    猜你喜欢
    • 2011-06-24
    • 1970-01-01
    • 2011-07-02
    • 2019-01-14
    • 2012-08-16
    • 1970-01-01
    • 1970-01-01
    • 2011-01-21
    相关资源
    最近更新 更多