11

我的理解是 StackOverflow 中的问题具有以下格式

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

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

首先我想知道这种理解是否错误:)

我有一个网址

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

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

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

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

4

3 回答 3

8

Response.RedirectPermanent自 ASP.NET 4.0 起,您可以使用可用的方法来执行此操作:

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 保存在数据库中。它使用类似这样的东西从标题动态创建。我只是改变了我的问题的标题,并且slug改变了。没有必要将 slug 存储在数据库中,因为它对标题是多余的。

于 2011-06-09T11:48:06.010 回答
5

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

这样做的原因是相当明显的:没有这个,你可以构建成千上万的 URL,比如http://stackoverflow.com/questions/6291678/foo, http://stackoverflow.com/questions/6291678/bar, http://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 页面抛出任何请求。

于 2011-06-09T11:43:13.333 回答
1

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

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

于 2011-06-09T11:54:31.500 回答