问题 StackOverflow就像URL Routing一样


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

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

所以基本上问题是使用question-id检索的。所以无论我给出什么价值的slu is都是无关紧要的。

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

我有一个URL

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

然后我像这样手动更换了slu ..

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

但它变成了原来的slu .. Firebug在改变的URL上向我展示了永久重定向301。如何实现此功能?


5662
2018-06-09 11:40


起源

在那里,我认为这是一个元问题:-) - Jodrell
@Jodrell:对我来说,SO本身就是一本关于如何建立网站的精彩书籍。我总是把它作为我的基准:) - naveen


答案:


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


8
2018-06-09 11:48



+1我已经编辑了你的答案了。否则我必须发布自己的答案。希望你不要介意。 - naveen
@naveen:我欢迎编辑,它显然提供了更完整的答案。谢谢! - aKzenT
我怎样才能在MVC中实现这一目标?我是说如何在ID之后附加文本?我正在使用asp.net mvc - kbvishnu


这是通过 301重定向 到了 首选规范网址。该脚本检查请求的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页面。


5
2018-06-09 11:43



是的。我很好奇如何在asp.net中实现这个:) - naveen
我认为您不需要实现它,只需在IIS 7中配置它(如果您在Windows Server 2008上运行)。 - Roy Dictus
@Roy你在检查数据库之前无法知道正确的slu ..因此,您无法在IIS上配置某些静态规则。 - BrunoLM
@BrunoLM好点:-) - Roy Dictus


你可以使用其中之一 IIS URL重写 要么 ASP.NET路由

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


1
2018-06-09 11:54